Skip to content

Commit dfc1988

Browse files
committed
[PROJ-18.6/compl] switching-sidebar-menu-btns
Adding logic for "switching" btn's in "sidebar/menu". Render/re-render. Worth noting: - that all this work/part (needs to be captured). FS-dev: B-3 / JS basic
1 parent d2e6eeb commit dfc1988

File tree

3 files changed

+79
-24
lines changed

3 files changed

+79
-24
lines changed

full-stack-dev/3-js-basic/18-proj-habit-tracker/18-6-switching-sidebar-menu-btns/data/demo.json

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
{
33
"id": 1,
44
"icon": "gantel-icon",
5-
"name": "Отжимания",
5+
"name": "Гантеля",
6+
"title": "Отжимания",
7+
"width": 23,
8+
"height": 23,
69
"target": 10,
710
"days": [
811
{ "comment": "Первый подход всегда даётся тяжело.." },
@@ -11,8 +14,21 @@
1114
},
1215
{
1316
"id": 2,
17+
"icon": "water-icon",
18+
"name": "Бутылка с водой",
19+
"title": "Водный баланс",
20+
"width": 25,
21+
"height": 25,
22+
"target": 10,
23+
"days": [{ "comment": "Очень хотелось!" }]
24+
},
25+
{
26+
"id": 3,
1427
"icon": "food-icon",
15-
"name": "Правильное питание",
28+
"name": "Тарелка с едой",
29+
"title": "Правильное питание",
30+
"width": 23,
31+
"height": 24,
1632
"target": 10,
1733
"days": [{ "comment": "Круто!" }]
1834
}

full-stack-dev/3-js-basic/18-proj-habit-tracker/18-6-switching-sidebar-menu-btns/index.html

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,27 +23,7 @@
2323
<img class="sidebar__logo" src="./images/logo.svg" width="66" height="71" alt="Логотип: Habit">
2424
</div>
2525
<nav class="sidebar__nav" aria-label="Навигация по привычкам" title="Навигация по привычкам">
26-
<ul class="sidebar__nav-list">
27-
<li class="sidebar__nav-item">
28-
<button class="sidebar__nav-btn sidebar__nav-btn_active" type="button" aria-label="Выбрать привычку"
29-
title="Отжимания">
30-
<img class="sidebar__nav-icon" src="./images/gantel-icon.svg" width="23" height="23"
31-
alt="Иконка: Гантеля">
32-
</button>
33-
</li>
34-
<li class="sidebar__nav-item">
35-
<button class="sidebar__nav-btn" type="button" aria-label="Выбрать привычку" title="Водный баланс">
36-
<img class="sidebar__nav-icon" src="./images/water-icon.svg" width="25" height="25"
37-
alt="Иконка: Бутылка с водой">
38-
</button>
39-
</li>
40-
<li class="sidebar__nav-item">
41-
<button class="sidebar__nav-btn" type="button" aria-label="Выбрать привычку" title="Правильное питание">
42-
<img class="sidebar__nav-icon" src="./images/food-icon.svg" width="23" height="24"
43-
alt="Иконка: Тарелка с едой">
44-
</button>
45-
</li>
46-
</ul>
26+
<ul class="sidebar__nav-list" id="sidebar-list"></ul>
4727
</nav>
4828
<div class="sidebar__add-btn-wrap">
4929
<button class="sidebar__add-btn" type="button" aria-label="Добавить привычку" aria-haspopup="true"

full-stack-dev/3-js-basic/18-proj-habit-tracker/18-6-switching-sidebar-menu-btns/js/index.js

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
let habbits = [];
44
const HABBITS_KEY = 'HABBITS';
55

6+
// app
7+
const app = {
8+
'menu-list': document.getElementById('sidebar-list'),
9+
};
10+
611
// ** utility **
712
function loadData() {
813
const habbitsStr = localStorage.getItem(HABBITS_KEY);
@@ -17,7 +22,61 @@ function saveData() {
1722
localStorage.setItem(HABBITS_KEY, JSON.stringify(habbits));
1823
}
1924

20-
// загрузка данных.. по сути автоматическая/сразу (соответственно через IIFE)
25+
// ** render **
26+
function rerenderMenu(activeHabbit) {
27+
if (!activeHabbit) {
28+
return;
29+
}
30+
31+
for (const habbit of habbits) {
32+
const existed = document.querySelector(`[menu-habbit-id="${habbit.id}"]`); // определение/флаг.. есть уже элемент (создавался) или нет
33+
34+
if (!existed) {
35+
// если НЕТ.. создание li/элемента sidebar/меню.. привычки (согласно data)
36+
const habbitItem = document.createElement('li');
37+
habbitItem.classList.add('sidebar__nav-item');
38+
39+
const habbitBtn = document.createElement('button');
40+
habbitBtn.classList.add('sidebar__nav-btn');
41+
habbitBtn.setAttribute('type', 'button');
42+
habbitBtn.setAttribute('aria-label', 'Выбрать привычку');
43+
habbitBtn.setAttribute('title', habbit.title);
44+
habbitBtn.setAttribute('menu-habbit-id', habbit.id);
45+
habbitBtn.innerHTML = `<img class="sidebar__nav-icon" src="./images/${habbit.icon}.svg" width="${habbit.width}" height="${habbit.height}" alt="Иконка: ${habbit.name}">`;
46+
47+
habbitBtn.addEventListener('click', () => rerender(habbit.id)); // тонкий момент.. по сути "замыкание" для каждой кнопки/её ID.. потом передача именно его/себя в rerender()
48+
49+
// проверка на активность (при создании)
50+
if (activeHabbit.id === habbit.id) {
51+
habbitBtn.classList.add('sidebar__nav-btn_active');
52+
}
53+
54+
habbitItem.append(habbitBtn);
55+
app['menu-list'].append(habbitItem);
56+
} else {
57+
// если ЕСТЬ.. только обновление "активного" класса
58+
if (activeHabbit.id === habbit.id) {
59+
existed.classList.add('sidebar__nav-btn_active');
60+
} else {
61+
existed.classList.remove('sidebar__nav-btn_active');
62+
}
63+
}
64+
}
65+
}
66+
67+
// поиск элемента/привычки.. запуск отрисовки/переключение активности
68+
function rerender(activeHabbitId) {
69+
const activeHabbit = habbits.find((habbit) => habbit.id === activeHabbitId);
70+
rerenderMenu(activeHabbit);
71+
}
72+
73+
// init
2174
(() => {
75+
// загрузка данных.. по сути автоматическая/сразу (соответственно через IIFE)
2276
loadData();
77+
78+
// запуск работы с sidebar/меню..
79+
if (habbits.length > 0) {
80+
rerender(habbits[0].id); // пока.. принудительно передаёт
81+
}
2382
})();

0 commit comments

Comments
 (0)