Skip to content

Commit be82a2f

Browse files
committed
[PW-11.6/ret] Add "highlighting" matches in table
Organiz "highlighting" of matches in tbl/cells (accord filter-inputs). Worth noting: - thus improving the UX. core: B-3 / JS-BL
1 parent 9942a38 commit be82a2f

File tree

2 files changed

+93
-5
lines changed
  • core-courses/3-js-basic-level/11-server-async-await/11-6-pw-11-server-async-await/students-db-client

2 files changed

+93
-5
lines changed

core-courses/3-js-basic-level/11-server-async-await/11-6-pw-11-server-async-await/students-db-client/css/table.css

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,35 @@
2121
color: var(--fire-red);
2222
}
2323

24+
.dboard__table .dboard__table-body-empty-row td {
25+
width: 100%;
26+
/* height: 325px; */
27+
font-size: 17px;
28+
color: var(--bootstrap-red);
29+
text-align: center;
30+
}
31+
32+
#tableThTag {
33+
width: 45px;
34+
}
35+
36+
#tableThFIO {
37+
width: 392px;
38+
}
39+
40+
#tableThFaculty {
41+
width: 301px;
42+
}
43+
44+
#tableThBirthDate {
45+
width: 278px;
46+
}
47+
48+
#tableThStartYear {
49+
width: 279px;
50+
}
51+
2452
.dboard__table-body-cell_number {
25-
min-width: 45px;
2653
min-height: 45px;
2754
}
2855

@@ -40,3 +67,11 @@
4067
box-shadow: 0 0 0 0.25rem var(--bootstrap-red);
4168
opacity: 0.5;
4269
}
70+
71+
/* media queries, any-hover */
72+
73+
@media (max-width: 320px) {
74+
.dboard__table .dboard__table-body-empty-row td {
75+
font-size: 13px;
76+
}
77+
}

core-courses/3-js-basic-level/11-server-async-await/11-6-pw-11-server-async-await/students-db-client/js/index.js

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -672,10 +672,10 @@
672672
const emptyTableTrRow = document.createElement('tr');
673673
const emptyTableTdCell = document.createElement('td');
674674

675+
emptyTableTrRow.classList.add('dboard__table-body-empty-row');
676+
675677
emptyTableTdCell.colSpan = 5; // объединение всех колонок
676678
emptyTableTdCell.textContent = message;
677-
emptyTableTdCell.style.color = '#e10c22';
678-
emptyTableTdCell.style.textAlign = 'center';
679679
emptyTableTrRow.append(emptyTableTdCell);
680680

681681
return emptyTableTrRow;
@@ -790,7 +790,6 @@
790790
if (updateStudentsDataArr.length > 0) {
791791
addStudentsToTable(updateStudentsDataArr); // отрисовка данных, наполнение таблицы студентов
792792
} else {
793-
alert('Ошибка при загрузке данных с сервера!');
794793
tableBody.append(
795794
createEmptyTableMessageRow(
796795
'Нет данных! Запустите/перезапустите сервер!'
@@ -1445,6 +1444,12 @@
14451444
function filterStudentsByFormInputs() {
14461445
updateStudentsDataArr = correctInitArr(studentsDataArrWithIds); // обновление исходного массива, перед фильтрацией
14471446

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+
14481453
if (formFilterFIOInput.value.trim() !== '') {
14491454
updateStudentsDataArr = updateStudentsDataArr.filter((student) =>
14501455
student.fullName
@@ -1478,14 +1483,62 @@
14781483
}
14791484

14801485
addStudentsToTable(updateStudentsDataArr); // пере-рисовка (пере-компоновка) таблицы студентов согласно фильтраций
1486+
highlightStudentSearchMatches({
1487+
searchFIO,
1488+
searchFaculty,
1489+
searchStartYear,
1490+
searchEndYear,
1491+
}); // выделение совпадений (передача контекста)
14811492
}
14821493

1494+
// отработка "дебаунс" задержки (если много данных, что бы снизить нагрузку)
1495+
let debounceTimer;
1496+
14831497
allFormFilterInputs.forEach((input) => {
14841498
input.addEventListener('input', () => {
1485-
filterStudentsByFormInputs();
1499+
clearTimeout(debounceTimer); // очистка предыдущей задержки
1500+
debounceTimer = setTimeout(filterStudentsByFormInputs, 600); // применение фильтрации не сразу
14861501
});
14871502
});
14881503

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+
14891542
// ** очистка полей ввода, форм (через внутренние clear кнопки)
14901543
const allClearBtn = document.querySelectorAll('.btn-clear');
14911544

0 commit comments

Comments
 (0)