Skip to content

Commit 29ef93a

Browse files
committed
[PRAC/cont] Add clients/tbl "sorting" logic
Organiz "sort" clients/tbl, by header cells ("click", ascend/descend). Worth noting: - immediately incorrect moments in the work. core: B-3 / JS-BL
1 parent df90e8e commit 29ef93a

File tree

1 file changed

+78
-11
lines changed
  • core-courses/3-js-basic-level/practicum-js-basic-level/sb-crm-client/js

1 file changed

+78
-11
lines changed

core-courses/3-js-basic-level/practicum-js-basic-level/sb-crm-client/js/index.js

Lines changed: 78 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,9 @@
9090
outTableBody.classList.add('crm__output-table-body');
9191
outTblHeadTr.classList.add('crm__output-table-head-row');
9292
outTblHeadThId.classList.add(
93+
'crm__output-table-head-cell',
9394
'head-cell',
94-
'head-cell-with-icon',
95-
'crm__output-table-head-cell'
95+
'head-cell-with-icon'
9696
);
9797
outTblHeadThIdWrap.classList.add('head-cell__wrap', 'head-cell__wrap-id');
9898
outTblHeadThIdText.classList.add('head-cell__text', 'head-cell__text-id');
@@ -102,9 +102,9 @@
102102
'head-cell__icon-up'
103103
);
104104
outTblHeadThFIO.classList.add(
105+
'crm__output-table-head-cell',
105106
'head-cell',
106-
'head-cell-with-icon',
107-
'crm__output-table-head-cell'
107+
'head-cell-with-icon'
108108
);
109109
outTblHeadThFIOWrap.classList.add('head-cell__wrap', 'head-cell__wrap-fio');
110110
outTblHeadThFIOText.classList.add('head-cell__text', 'head-cell__text-fio');
@@ -115,9 +115,9 @@
115115
);
116116
outTblHeadThFIOSort.classList.add('head-cell__sort', 'head-cell__sort-fio');
117117
outTblHeadThCreationDT.classList.add(
118+
'crm__output-table-head-cell',
118119
'head-cell',
119-
'head-cell-with-icon',
120-
'crm__output-table-head-cell'
120+
'head-cell-with-icon'
121121
);
122122
outTblHeadThDTWrap.classList.add('head-cell__wrap', 'head-cell__wrap-dt');
123123
outTblHeadThDTText.classList.add('head-cell__text', 'head-cell__text-dt');
@@ -127,9 +127,9 @@
127127
'head-cell__icon-down'
128128
);
129129
outTblHeadThChanges.classList.add(
130+
'crm__output-table-head-cell',
130131
'head-cell',
131-
'head-cell-with-icon',
132-
'crm__output-table-head-cell'
132+
'head-cell-with-icon'
133133
);
134134
outTblHeadThChangeWrap.classList.add(
135135
'head-cell__wrap',
@@ -145,8 +145,8 @@
145145
'head-cell__icon-down'
146146
);
147147
outTblHeadThContacts.classList.add(
148-
'head-cell',
149-
'crm__output-table-head-cell'
148+
'crm__output-table-head-cell',
149+
'head-cell'
150150
);
151151
outTblHeadThContactWrap.classList.add(
152152
'head-cell__wrap',
@@ -156,7 +156,7 @@
156156
'head-cell__text',
157157
'head-cell__text-contact'
158158
);
159-
outTblHeadThActions.classList.add('head-cell', 'crm__output-table-head-cell');
159+
outTblHeadThActions.classList.add('crm__output-table-head-cell', 'head-cell');
160160
outTblHeadThActionWrap.classList.add(
161161
'head-cell__wrap',
162162
'head-cell__wrap-action'
@@ -3032,4 +3032,71 @@
30323032
});
30333033
}, 3000);
30343034
}
3035+
3036+
// ** сортировка клиентов/таблицы, по ячейкам заголовочной строки (по нажатию, по возрастанию/убыванию)
3037+
const allHeaderRowCellsForSort = document.querySelectorAll(
3038+
'.crm__output-table-head-cell'
3039+
);
3040+
let sortDirectionUpDown = true;
3041+
3042+
function sortClientsByTableCells(event) {
3043+
const clickedTableCell = event.target.textContent; // определение заглавного поля/ячейки, по которой происходит "click" - событие, фиксация контента
3044+
3045+
console.log(clickedTableCell);
3046+
3047+
updateClientsDataArr.sort((a, b) => {
3048+
if (clickedTableCell === 'ID') {
3049+
return a.shortId - b.shortId;
3050+
} else if (clickedTableCell === 'Фамилия Имя Отчество') {
3051+
return sortDirectionUpDown
3052+
? a.fullName.localeCompare(b.fullName)
3053+
: b.fullName.localeCompare(a.fullName);
3054+
} else if (clickedTableCell === 'Дата и время создания') {
3055+
return sortDirectionUpDown
3056+
? a.faculty.localeCompare(b.faculty)
3057+
: b.faculty.localeCompare(a.faculty);
3058+
} else if (clickedTableCell === 'Последние изменения') {
3059+
const birthDateComparison =
3060+
new Date(a.birthDate).setHours(0, 0, 0, 0) -
3061+
new Date(b.birthDate).setHours(0, 0, 0, 0); // корректировка часов рождения (всем одно)
3062+
if (birthDateComparison !== 0) {
3063+
return sortDirectionUpDown
3064+
? birthDateComparison
3065+
: -birthDateComparison;
3066+
}
3067+
return sortDirectionUpDown
3068+
? a.fullName.localeCompare(b.fullName)
3069+
: b.fullName.localeCompare(a.fullName); // если даты рождения равны, по ФИО будет сортировка
3070+
} else if (clickedTableCell === 'Годы обучения') {
3071+
const startYearComparison = a.startYear - b.startYear;
3072+
if (startYearComparison !== 0) {
3073+
return sortDirectionUpDown
3074+
? startYearComparison
3075+
: -startYearComparison;
3076+
}
3077+
return sortDirectionUpDown
3078+
? a.fullName.localeCompare(b.fullName)
3079+
: b.fullName.localeCompare(a.fullName); // если годы начала/окончания равны, по ФИО будет сортировка
3080+
}
3081+
return 0;
3082+
});
3083+
3084+
addClientsToTable(updateClientsDataArr); // пере-рисовка (пере-компоновка) после сортировки (прожатия ячеек)
3085+
}
3086+
3087+
allHeaderRowCellsForSort.forEach((cell) => {
3088+
cell.addEventListener('click', (event) => {
3089+
sortClientsByTableCells(event); // передача события
3090+
sortDirectionUpDown = !sortDirectionUpDown; // изменение условия сортировки
3091+
});
3092+
3093+
// отработка сортировки/сброса сортировки через TAB/Enter
3094+
cell.addEventListener('keydown', (event) => {
3095+
if (event.key === 'Enter') {
3096+
event.preventDefault();
3097+
sortClientsByTableCells(event); // передача события
3098+
sortDirectionUpDown = !sortDirectionUpDown; // изменение условия сортировки
3099+
}
3100+
});
3101+
});
30353102
})();

0 commit comments

Comments
 (0)