${note.date} ${note.time}
+ ${imagesHtml}
`;
notesList.insertAdjacentHTML("afterbegin", noteHtml);
- });
+ }
// Добавляем обработчики событий для кнопок редактирования и удаления
addNoteEventListeners();
@@ -453,6 +635,9 @@ function renderNotes(notes) {
// Добавляем обработчики кликов для тегов в заметках
addTagClickListeners();
+ // Добавляем обработчики для изображений в заметках
+ addImageEventListeners();
+
// Обрабатываем длинные заметки
handleLongNotes();
}
@@ -518,7 +703,7 @@ function addNoteEventListeners() {
}
// Перезагружаем заметки
- loadNotes();
+ await loadNotes();
} catch (error) {
console.error("Ошибка:", error);
alert("Ошибка удаления заметки");
@@ -617,7 +802,7 @@ function addNoteEventListeners() {
}
// Перезагружаем заметки
- loadNotes();
+ await loadNotes();
} catch (error) {
console.error("Ошибка:", error);
alert("Ошибка сохранения заметки");
@@ -662,7 +847,7 @@ function addNoteEventListeners() {
// Функция для добавления обработчиков кликов на теги в заметках
function addTagClickListeners() {
document.querySelectorAll(".textNote .tag-in-note").forEach((tagElement) => {
- tagElement.addEventListener("click", function (event) {
+ tagElement.addEventListener("click", async function (event) {
event.preventDefault();
event.stopPropagation();
@@ -676,16 +861,69 @@ function addTagClickListeners() {
}
// Перерисовываем заметки и теги
- renderNotes(allNotes);
+ await renderNotes(allNotes);
renderTags();
updateFilterIndicator();
});
});
}
+// Функция для добавления обработчиков для изображений в заметках
+function addImageEventListeners() {
+ // Обработчики для кликов на изображения (открытие в модальном окне)
+ document.querySelectorAll(".note-image").forEach((imageElement) => {
+ // Проверяем, не добавлен ли уже обработчик
+ if (imageElement._clickHandler) {
+ return; // Пропускаем, если обработчик уже добавлен
+ }
+
+ // Создаем новый обработчик
+ imageElement._clickHandler = function (event) {
+ event.preventDefault();
+ event.stopPropagation();
+ const imageSrc = this.dataset.imageSrc;
+ console.log('Image clicked, src:', imageSrc); // Для отладки
+ if (imageSrc) {
+ showImageModal(imageSrc);
+ }
+ };
+
+ imageElement.addEventListener("click", imageElement._clickHandler);
+ });
+
+ // Обработчики для кнопок удаления изображений
+ document.querySelectorAll(".remove-note-image-btn").forEach((buttonElement) => {
+ // Удаляем старые обработчики, если они есть
+ if (buttonElement._clickHandler) {
+ buttonElement.removeEventListener("click", buttonElement._clickHandler);
+ }
+
+ // Создаем новый обработчик
+ buttonElement._clickHandler = async function (event) {
+ event.preventDefault();
+ event.stopPropagation();
+
+ const noteId = this.dataset.noteId;
+ const imageId = this.dataset.imageId;
+
+ if (noteId && imageId && confirm("Вы уверены, что хотите удалить это изображение?")) {
+ const success = await deleteNoteImage(noteId, imageId);
+ if (success) {
+ await loadNotes(); // Перезагружаем заметки
+ } else {
+ alert("Ошибка удаления изображения");
+ }
+ }
+ };
+
+ buttonElement.addEventListener("click", buttonElement._clickHandler);
+ });
+}
+
+
// Функция сохранения заметки (вынесена отдельно для повторного использования)
async function saveNote() {
- if (noteInput.value.trim() !== "") {
+ if (noteInput.value.trim() !== "" || selectedImages.length > 0) {
try {
const { date, time } = getFormattedDateTime();
@@ -695,7 +933,7 @@ async function saveNote() {
"Content-Type": "application/json",
},
body: JSON.stringify({
- content: noteInput.value,
+ content: noteInput.value || " ", // Минимальный контент, если только изображения
date: date,
time: time,
}),
@@ -705,10 +943,21 @@ async function saveNote() {
throw new Error("Ошибка сохранения заметки");
}
- // Очищаем поле ввода и перезагружаем заметки
+ const noteData = await response.json();
+ const noteId = noteData.id;
+
+ // Загружаем изображения, если они есть
+ if (selectedImages.length > 0) {
+ await uploadImages(noteId);
+ }
+
+ // Очищаем поле ввода и изображения, перезагружаем заметки
noteInput.value = "";
noteInput.style.height = "auto";
- loadNotes();
+ selectedImages = [];
+ updateImagePreview();
+ imageInput.value = "";
+ await loadNotes();
} catch (error) {
console.error("Ошибка:", error);
alert("Ошибка сохранения заметки");
@@ -899,7 +1148,7 @@ function renderCalendar() {
}
// Добавляем обработчик клика
- dayDiv.addEventListener("click", handleDayClick);
+ dayDiv.addEventListener("click", async (event) => await handleDayClick(event));
calendarDays.appendChild(dayDiv);
}
@@ -936,7 +1185,7 @@ function renderCalendar() {
}
// Добавляем обработчик клика
- dayDiv.addEventListener("click", handleDayClick);
+ dayDiv.addEventListener("click", async (event) => await handleDayClick(event));
calendarDays.appendChild(dayDiv);
}
@@ -968,14 +1217,14 @@ function renderCalendar() {
}
// Добавляем обработчик клика
- dayDiv.addEventListener("click", handleDayClick);
+ dayDiv.addEventListener("click", async (event) => await handleDayClick(event));
calendarDays.appendChild(dayDiv);
}
}
// Обработчик клика на день в календаре
-function handleDayClick(event) {
+async function handleDayClick(event) {
const clickedDate = event.target.dataset.date;
// Если кликнули на тот же день, снимаем фильтр
@@ -986,7 +1235,7 @@ function handleDayClick(event) {
}
// Перерисовываем заметки, календарь и теги
- renderNotes(allNotes);
+ await renderNotes(allNotes);
renderCalendar();
renderTags();
updateFilterIndicator();
@@ -1028,7 +1277,7 @@ function updateFilterIndicator() {
}
// Функция для сброса фильтра (глобальная)
-window.clearFilter = function () {
+window.clearFilter = async function () {
selectedDateFilter = null;
selectedTagFilter = null;
searchQuery = "";
@@ -1046,12 +1295,15 @@ window.clearFilter = function () {
clearSearchBtn.style.display = "none";
}
- renderNotes(allNotes);
+ await renderNotes(allNotes);
renderCalendar();
renderTags();
updateFilterIndicator();
};
+// Глобальные функции для работы с изображениями (оставляем только showImageModal для совместимости)
+// window.showImageModal удалена, так как она создавала рекурсию
+
// Обработчики для кнопок навигации календаря
const prevMonthBtn = document.getElementById("prevMonth");
const nextMonthBtn = document.getElementById("nextMonth");
@@ -1106,23 +1358,23 @@ function initSearch() {
});
// Обработчик клика на кнопку очистки поиска
- clearSearchBtn.addEventListener("click", function () {
+ clearSearchBtn.addEventListener("click", async function () {
searchInput.value = "";
this.style.display = "none";
searchQuery = "";
searchResults = [];
- renderNotes(allNotes);
+ await renderNotes(allNotes);
updateFilterIndicator();
});
// Обработчик клавиши Escape для очистки поиска
- searchInput.addEventListener("keydown", function (event) {
+ searchInput.addEventListener("keydown", async function (event) {
if (event.key === "Escape") {
this.value = "";
clearSearchBtn.style.display = "none";
searchQuery = "";
searchResults = [];
- renderNotes(allNotes);
+ await renderNotes(allNotes);
updateFilterIndicator();
}
});
@@ -1206,7 +1458,7 @@ function renderCalendarMobile() {
}
// Добавляем обработчик клика
- dayDiv.addEventListener("click", handleDayClickMobile);
+ dayDiv.addEventListener("click", async (event) => await handleDayClickMobile(event));
calendarDays.appendChild(dayDiv);
}
@@ -1243,7 +1495,7 @@ function renderCalendarMobile() {
}
// Добавляем обработчик клика
- dayDiv.addEventListener("click", handleDayClickMobile);
+ dayDiv.addEventListener("click", async (event) => await handleDayClickMobile(event));
calendarDays.appendChild(dayDiv);
}
@@ -1275,14 +1527,14 @@ function renderCalendarMobile() {
}
// Добавляем обработчик клика
- dayDiv.addEventListener("click", handleDayClickMobile);
+ dayDiv.addEventListener("click", async (event) => await handleDayClickMobile(event));
calendarDays.appendChild(dayDiv);
}
}
// Обработчик клика на день в календаре для мобильной версии
-function handleDayClickMobile(event) {
+async function handleDayClickMobile(event) {
const clickedDate = event.target.dataset.date;
// Если кликнули на тот же день, снимаем фильтр
@@ -1293,7 +1545,7 @@ function handleDayClickMobile(event) {
}
// Перерисовываем заметки, оба календаря и теги
- renderNotes(allNotes);
+ await renderNotes(allNotes);
renderCalendar();
renderCalendarMobile();
renderTags();
@@ -1325,12 +1577,12 @@ function renderTagsMobile() {
// Добавляем обработчики кликов для тегов
tagsContainer.querySelectorAll(".tag").forEach((tagElement) => {
- tagElement.addEventListener("click", handleTagClickMobile);
+ tagElement.addEventListener("click", async (event) => await handleTagClickMobile(event));
});
}
// Обработчик клика на тег в мобильном слайдере
-function handleTagClickMobile(event) {
+async function handleTagClickMobile(event) {
const clickedTag = event.target.closest(".tag").dataset.tag;
// Если кликнули на тот же тег, снимаем фильтр
@@ -1341,7 +1593,7 @@ function handleTagClickMobile(event) {
}
// Перерисовываем заметки, теги и оба календаря
- renderNotes(allNotes);
+ await renderNotes(allNotes);
renderTags();
renderTagsMobile();
renderCalendar();
@@ -1452,7 +1704,7 @@ function initSearchMobile() {
});
// Обработчик клика на кнопку очистки поиска
- clearSearchBtn.addEventListener("click", function () {
+ clearSearchBtn.addEventListener("click", async function () {
searchInput.value = "";
this.style.display = "none";
searchQuery = "";
@@ -1466,7 +1718,7 @@ function initSearchMobile() {
if (mainClearSearchBtn) {
mainClearSearchBtn.style.display = "none";
}
- renderNotes(allNotes);
+ await renderNotes(allNotes);
updateFilterIndicator();
});
diff --git a/public/notes.html b/public/notes.html
index d27cc49..7b6425b 100644
--- a/public/notes.html
+++ b/public/notes.html
@@ -197,6 +197,9 @@
+