Skip to content

Commit 44b9623

Browse files
authored
Merge pull request #13 from LakshmiCJayagopal/feat/responsiveness
feat: add mobile sidebar, add todo delete button
2 parents 41cdaca + f4133fb commit 44b9623

3 files changed

Lines changed: 185 additions & 9 deletions

File tree

src/assets/styles.css

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,15 @@ body {
168168
padding: 10px;
169169
margin-bottom: 5px;
170170
border-radius: 5px;
171+
position: relative;
172+
}
173+
174+
.todo-item:hover .delete-todo-btn {
175+
opacity: 0.8;
176+
}
177+
178+
.todo-due-date {
179+
margin-right: 5px;
171180
}
172181

173182
.todo-checkbox {
@@ -213,6 +222,29 @@ body {
213222
background-color: var(--button-color-hover);
214223
}
215224

225+
.delete-todo-btn {
226+
background: transparent;
227+
border: none;
228+
color: var(--primary-dark);
229+
cursor: pointer;
230+
font-size: 0.9rem;
231+
opacity: 0.6;
232+
margin-left: 10px;
233+
padding: 5px;
234+
transition: all 0.2s ease;
235+
border-radius: 50%;
236+
display: flex;
237+
align-items: center;
238+
justify-content: center;
239+
width: 25px;
240+
height: 25px;
241+
}
242+
243+
.delete-todo-btn:hover {
244+
opacity: 1;
245+
background-color: rgba(0, 0, 0, 0.1);
246+
}
247+
216248
/* Footer */
217249
.footer {
218250
position: sticky;
@@ -334,3 +366,65 @@ body {
334366
.submit-todo:hover {
335367
background-color: var(--button-color-hover);
336368
}
369+
370+
/* Hamburger menu icon - hidden on desktop */
371+
.hamburger-menu {
372+
display: none !important;
373+
font-size: 1.5rem;
374+
}
375+
376+
/* Mobile styles */
377+
@media screen and (max-width: 768px) {
378+
/* Hide the To-Do icon on mobile */
379+
.header-left-section .fa-check-double {
380+
display: none;
381+
}
382+
383+
/* Show hamburger menu on mobile */
384+
.hamburger-menu {
385+
display: block !important;
386+
margin-right: 10px;
387+
}
388+
389+
/* Content layout changes for mobile */
390+
.content {
391+
position: relative; /* For absolute positioning of sidebar */
392+
}
393+
394+
/* Hide sidebar by default on mobile */
395+
.sidebar {
396+
position: absolute;
397+
left: -100%;
398+
top: 0;
399+
height: 100%;
400+
width: 80%;
401+
z-index: 10;
402+
transition: left 0.3s ease;
403+
box-shadow: 2px 0 5px rgba(0, 0, 0, 0.1);
404+
}
405+
406+
/* When sidebar is open */
407+
.sidebar.open {
408+
left: 0;
409+
}
410+
411+
/* Make taskview take full width by default */
412+
.taskview {
413+
width: 100%;
414+
}
415+
416+
/* Overlay when sidebar is open */
417+
.sidebar-overlay {
418+
display: none;
419+
position: fixed;
420+
top: 0;
421+
left: 0;
422+
width: 100%;
423+
height: 100%;
424+
background-color: rgba(0, 0, 0, 0.5);
425+
}
426+
427+
.sidebar-overlay.active {
428+
display: block;
429+
}
430+
}

src/scripts/Modules/UI.js

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ export default class UI {
102102
this.loadProjects();
103103
}
104104

105+
105106
OpenProject(projectName) {
106107
const taskviewSection = document.querySelector(".taskview");
107108
taskviewSection.innerHTML = `
@@ -112,13 +113,16 @@ export default class UI {
112113
let todoItems = this.app.viewTodos(projectName); // load the projectTodos
113114
if (todoItems) {
114115
const tasksWrapper = taskviewSection.querySelector('.tasks-wrapper');
115-
todoItems.forEach(todoItem => {
116+
todoItems.forEach((todoItem, index) => {
116117
let todoElement = document.createElement("div");
117118
todoElement.className = `todo-item priority-${todoItem.priority.toLowerCase()}`;
118119
todoElement.innerHTML = `
119120
<input type="checkbox" class="todo-checkbox" id="todo-${todoItem.title}" ${todoItem.completed ? 'checked' : ''}>
120121
<label for="todo-${todoItem.title}" class="todo-title">${todoItem.title}</label>
121122
<span class="todo-due-date">${todoItem.dueDate}</span>
123+
<button class="delete-todo-btn" data-index="${index}">
124+
<i class="fas fa-times"></i>
125+
</button>
122126
`;
123127
tasksWrapper.appendChild(todoElement);
124128

@@ -129,20 +133,32 @@ export default class UI {
129133
this.OpenProject(projectName); // Refresh the project view
130134
});
131135

136+
// Add event listener for delete button
137+
const deleteBtn = todoElement.querySelector('.delete-todo-btn');
138+
deleteBtn.addEventListener('click', (event) => {
139+
this.onDeleteTodo(event, projectName);
140+
});
132141
});
133142
}
134-
135143
// Create the "Create New ToDo" button
136144
let createNewTodoBtn = document.createElement("div");
137145
createNewTodoBtn.classList.add("new-todo-btn-wrapper");
138146
createNewTodoBtn.innerHTML = `<button class="new-todo-btn">Add New Task</button>`;
139147
taskviewSection.appendChild(createNewTodoBtn);
140-
148+
141149
// Open the modal when "Create New ToDo" button is clicked
142150
createNewTodoBtn.addEventListener('click', () => this.onCreateNewTodo(projectName));
143151
}
144-
145-
onProjectDelete(event) {
152+
// Add this new method to the UI class to handle task deletion
153+
onDeleteTodo(event, projectName) {
154+
const todoIndex = parseInt(event.currentTarget.getAttribute('data-index'));
155+
156+
if (confirm('Are you sure you want to delete this task?')) {
157+
this.app.removeTodoFromProject(projectName, todoIndex);
158+
this.OpenProject(projectName); // Refresh the project view
159+
}
160+
}
161+
onProjectDelete(event) {
146162
try {
147163
const projectItem = event.currentTarget.closest('.project-item');
148164
const projectButton = projectItem.querySelector('.button-project');

src/scripts/index.js

Lines changed: 70 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,76 @@ import '@fortawesome/fontawesome-free/css/all.min.css';
44
import UI from './Modules/UI'
55
import TodoApp from './Modules/TodoApp';
66
document.addEventListener('DOMContentLoaded', () => {
7-
const ui = new UI();
8-
ui.loadHomepage();
9-
});
7+
const ui = new UI();
8+
ui.loadHomepage();
9+
10+
// Setup mobile sidebar functionality
11+
setupMobileSidebar();
12+
13+
// Update date display
1014
const dateTimeEle = document.getElementById("currentDatetime");
1115
const currDate = new Date();
1216
dateTimeEle.innerText = currDate.toLocaleDateString();
13-
// mainMenu(); //use to call the consoleApp(uncomment import statement).
17+
});
18+
19+
function setupMobileSidebar() {
20+
// Create hamburger menu element
21+
const hamburgerMenu = document.createElement('i');
22+
hamburgerMenu.className = 'fas fa-bars hamburger-menu';
23+
24+
// Add hamburger to header's left section
25+
const headerLeftSection = document.querySelector('.header-left-section');
26+
headerLeftSection.insertBefore(hamburgerMenu, headerLeftSection.firstChild);
27+
28+
// Create overlay element
29+
const overlay = document.createElement('div');
30+
overlay.className = 'sidebar-overlay';
31+
document.body.appendChild(overlay);
32+
33+
// Add click event for hamburger menu
34+
hamburgerMenu.addEventListener('click', toggleSidebar);
35+
36+
// Add click event for overlay to close sidebar
37+
overlay.addEventListener('click', closeSidebar);
38+
39+
// Function to toggle sidebar
40+
function toggleSidebar() {
41+
const sidebar = document.querySelector('.sidebar');
42+
43+
sidebar.classList.toggle('open');
44+
overlay.classList.toggle('active');
45+
46+
// Toggle hamburger icon between bars and X
47+
if (sidebar.classList.contains('open')) {
48+
hamburgerMenu.className = 'fas fa-times hamburger-menu';
49+
} else {
50+
hamburgerMenu.className = 'fas fa-bars hamburger-menu';
51+
}
52+
}
53+
54+
// Function to close sidebar
55+
function closeSidebar() {
56+
const sidebar = document.querySelector('.sidebar');
57+
sidebar.classList.remove('open');
58+
overlay.classList.remove('active');
59+
hamburgerMenu.className = 'fas fa-bars hamburger-menu';
60+
}
61+
62+
// Close sidebar when clicking on a project (better UX on mobile)
63+
const projectsList = document.querySelector('.projects-list');
64+
projectsList.addEventListener('click', function(e) {
65+
if (window.innerWidth <= 768) {
66+
// Check if clicked element is a project button or part of it
67+
if (e.target.closest('.button-project')) {
68+
closeSidebar();
69+
}
70+
}
71+
});
72+
73+
// Close sidebar when window resizes above mobile breakpoint
74+
window.addEventListener('resize', function() {
75+
if (window.innerWidth > 768) {
76+
closeSidebar();
77+
}
78+
});
79+
}

0 commit comments

Comments
 (0)