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
84 lines (76 loc) • 6.5 kB
JavaScript
/*! 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 */
"use strict";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);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class o{constructor(e){a(this,"remindersKey","html-editor-calendar-reminders");a(this,"checkInterval",null);a(this,"calendarManager",null);this.calendarManager=e||null,this.startReminderCheck()}setCalendarManager(e){this.calendarManager=e}createReminder(e,r){if(!e.reminder)throw new Error("Event has no reminder set");const i=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)}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>
`}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))}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>
`}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)}}exports.ReminderService=o;