mirror of
https://github.com/amitwh/markdown-converter.git
synced 2026-08-02 18:10:18 +05:30
82 lines
3.0 KiB
JavaScript
82 lines
3.0 KiB
JavaScript
function renderSnapshotsPanel(container, { engines, editor }) {
|
|
const snapshots = engines.snapshots.list();
|
|
|
|
container.replaceChildren();
|
|
|
|
const panel = document.createElement('div');
|
|
panel.className = 'ws-panel';
|
|
|
|
// Header with take snapshot button
|
|
const section = document.createElement('div');
|
|
section.className = 'ws-section';
|
|
const btn = document.createElement('button');
|
|
btn.className = 'ws-btn ws-btn-primary';
|
|
btn.id = 'ws-take-snapshot';
|
|
btn.textContent = 'Take Snapshot';
|
|
section.appendChild(btn);
|
|
const count = document.createElement('span');
|
|
count.className = 'ws-muted';
|
|
count.textContent = snapshots.length + ' snapshots';
|
|
section.appendChild(count);
|
|
panel.appendChild(section);
|
|
|
|
// Snapshot list
|
|
const list = document.createElement('div');
|
|
list.className = 'ws-snapshot-list';
|
|
for (const s of snapshots) {
|
|
const item = document.createElement('div');
|
|
item.className = 'ws-snapshot-item';
|
|
|
|
const header = document.createElement('div');
|
|
header.className = 'ws-snapshot-header';
|
|
const sLabel = document.createElement('span');
|
|
sLabel.className = 'ws-snapshot-label';
|
|
sLabel.textContent = s.label;
|
|
const sWords = document.createElement('span');
|
|
sWords.textContent = s.wordCount + ' words';
|
|
header.appendChild(sLabel);
|
|
header.appendChild(sWords);
|
|
item.appendChild(header);
|
|
|
|
const time = document.createElement('div');
|
|
time.className = 'ws-snapshot-time';
|
|
time.textContent = new Date(s.timestamp).toLocaleString();
|
|
item.appendChild(time);
|
|
|
|
const actions = document.createElement('div');
|
|
actions.className = 'ws-snapshot-actions';
|
|
for (const [action, text, cls] of [['restore', 'Restore', ''], ['diff', 'Diff', ''], ['delete', 'Delete', 'ws-btn-danger']]) {
|
|
const actionBtn = document.createElement('button');
|
|
actionBtn.className = 'ws-btn ws-btn-sm' + (cls ? ' ' + cls : '');
|
|
actionBtn.textContent = text;
|
|
actionBtn.addEventListener('click', () => {
|
|
if (action === 'restore') {
|
|
const content = engines.snapshots.restore(s.id);
|
|
editor.insertAtCursor(content);
|
|
} else if (action === 'delete') {
|
|
engines.snapshots.delete(s.id);
|
|
renderSnapshotsPanel(container, { engines, editor });
|
|
} else if (action === 'diff') {
|
|
const current = editor.getContent() || '';
|
|
const result = engines.snapshots.diff(s.id, current);
|
|
alert('+' + result.added + ' lines added, -' + result.removed + ' lines removed');
|
|
}
|
|
});
|
|
actions.appendChild(actionBtn);
|
|
}
|
|
item.appendChild(actions);
|
|
list.appendChild(item);
|
|
}
|
|
panel.appendChild(list);
|
|
container.appendChild(panel);
|
|
|
|
// Take snapshot button handler
|
|
container.querySelector('#ws-take-snapshot').addEventListener('click', () => {
|
|
const content = editor.getContent() || '';
|
|
engines.snapshots.create(content, 'manual');
|
|
renderSnapshotsPanel(container, { engines, editor });
|
|
});
|
|
}
|
|
|
|
module.exports = { renderSnapshotsPanel };
|