UNPKG

on-codemerge

Version:

A WYSIWYG editor for on-codemerge is a user-friendly interface that allows users to edit and view their code in real time, exactly as it will appear in the final product

194 lines (186 loc) 7.89 kB
/*! on-codemerge v1.3.1 @author Pavel Kuzmin @license MIT @homepage https://s00d.github.io/on-codemerge/ @repository git+https://github.com/s00d/on-codemerge.git Copyright (c) 2026 Pavel Kuzmin - Built on 2026-07-02T13:39:17.947Z */ var c = Object.defineProperty; var m = (d, e, r) => e in d ? c(d, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : d[e] = r; var a = (d, e, r) => m(d, typeof e != "symbol" ? e + "" : e, r); class l { constructor(e) { a(this, "remindersKey", "html-editor-calendar-reminders"); a(this, "checkInterval", null); a(this, "calendarManager", null); this.calendarManager = e || null, this.startReminderCheck(); } // Установка ссылки на CalendarManager setCalendarManager(e) { this.calendarManager = e; } // Создание напоминания createReminder(e, r) { if (!e.reminder) throw new Error("Event has no reminder set"); const i = (/* @__PURE__ */ new Date(`${e.date}T${e.time}`)).getTime() - e.reminder * 60 * 1e3, t = { id: crypto.randomUUID(), eventId: e.id, calendarId: r, triggerTime: i, message: `Reminder: ${e.title} starts in ${e.reminder} minutes`, isShown: !1, createdAt: Date.now() }, s = this.getReminders(); return s.push(t), localStorage.setItem(this.remindersKey, JSON.stringify(s)), t; } // Получение всех напоминаний getReminders() { const e = localStorage.getItem(this.remindersKey); return e ? JSON.parse(e) : []; } // Получение напоминаний для события getEventReminders(e) { return this.getReminders().filter((r) => r.eventId === e); } // Удаление напоминания deleteReminder(e) { const r = this.getReminders().filter((n) => n.id !== e); localStorage.setItem(this.remindersKey, JSON.stringify(r)); } // Удаление всех напоминаний события deleteEventReminders(e) { const r = this.getReminders().filter((n) => n.eventId !== e); localStorage.setItem(this.remindersKey, JSON.stringify(r)); } // Проверка напоминаний startReminderCheck() { this.checkInterval && clearInterval(this.checkInterval), this.checkInterval = window.setInterval(() => { this.checkReminders(); }, 6e4); } checkReminders() { const e = Date.now(); this.getReminders().filter( (i) => i.triggerTime <= e && !i.isShown ).forEach((i) => { this.showReminder(i); }); } // Показать напоминание showReminder(e) { const r = this.getReminders(), n = r.findIndex((t) => t.id === e.id); n !== -1 && (r[n].isShown = !0, localStorage.setItem(this.remindersKey, JSON.stringify(r))); const i = this.generateReminderHTML(e); this.insertReminderHTML(i, e.id); } // Генерация HTML кода для напоминания generateReminderHTML(e) { const r = this.getEventById(e.eventId); if (!r) return ""; const n = r.priority || "medium", i = r.color || "#3b82f6", t = r.tags && r.tags.length > 0 ? `<div class="event-tags">${r.tags.map((s) => `<span class="event-tag">${s}</span>`).join("")}</div>` : ""; return ` <div class="calendar-reminder" data-reminder-id="${e.id}" data-event-id="${e.eventId}"> <div class="reminder-header"> <div class="reminder-icon">⏰</div> <div class="reminder-title">Event Reminder</div> <button class="reminder-close" onclick="this.closest('.calendar-reminder').remove()">×</button> </div> <div class="reminder-content"> <div class="reminder-event-title">${r.title}</div> <div class="reminder-event-time">${r.date} at ${r.time}</div> ${r.location ? `<div class="reminder-event-location">📍 ${r.location}</div>` : ""} ${r.description ? `<div class="reminder-event-description">${r.description}</div>` : ""} ${t} </div> <div class="reminder-footer"> <div class="reminder-priority priority-${n}">${n.toUpperCase()}</div> <div class="reminder-category" style="background-color: ${i}">${r.category || "General"}</div> </div> </div> `; } // Вставка HTML напоминания в DOM insertReminderHTML(e, r) { let n = document.querySelector(".calendar-reminders-container"); n || (n = document.createElement("div"), n.className = "calendar-reminders-container", n.style.cssText = ` position: fixed; top: 20px; right: 20px; z-index: 10000; max-width: 400px; pointer-events: none; `, document.body.appendChild(n)); const i = document.createElement("div"); i.innerHTML = e; const t = i.firstElementChild; t && (n.appendChild(t), setTimeout(() => { t.parentNode && t.parentNode.removeChild(t); }, 3e4)); } // Генерация JavaScript кода для клиента generateReminderScript(e) { const r = this.getReminders().filter((i) => i.calendarId === e); if (r.length === 0) return ""; const n = r.map((i) => ({ id: i.id, eventId: i.eventId, triggerTime: i.triggerTime, message: i.message })); return ` <script> (function() { const reminderData = ${JSON.stringify(n)}; const now = Date.now(); function showReminder(reminder) { const reminderHtml = \` <div class="calendar-reminder" data-reminder-id="\${reminder.id}"> <div class="reminder-header"> <div class="reminder-icon">⏰</div> <div class="reminder-title">Event Reminder</div> <button class="reminder-close" onclick="this.closest('.calendar-reminder').remove()">×</button> </div> <div class="reminder-content"> <div class="reminder-message">\${reminder.message}</div> </div> </div> \`; let container = document.querySelector('.calendar-reminders-container'); if (!container) { container = document.createElement('div'); container.className = 'calendar-reminders-container'; container.style.cssText = 'position: fixed; top: 20px; right: 20px; z-index: 10000; max-width: 400px;'; document.body.appendChild(container); } const reminderElement = document.createElement('div'); reminderElement.innerHTML = reminderHtml; container.appendChild(reminderElement.firstElementChild); setTimeout(() => { const reminder = document.querySelector(\`[data-reminder-id="\${reminder.id}"]\`); if (reminder && reminder.parentNode) { reminder.parentNode.removeChild(reminder); } }, 30000); } function checkReminders() { reminderData.forEach(reminder => { if (reminder.triggerTime <= now) { showReminder(reminder); } }); } // Проверяем сразу checkReminders(); // Проверяем каждую минуту setInterval(checkReminders, 60000); })(); <\/script> `; } // Получение события по ID из CalendarManager getEventById(e) { return this.calendarManager ? this.calendarManager.getEvent(e) : (console.warn("CalendarManager not set in ReminderService"), null); } // Очистка ресурсов destroy() { this.checkInterval && (clearInterval(this.checkInterval), this.checkInterval = null); } } export { l as ReminderService };