// Brain Dump Plugin - Quickly capture many tasks at once
var _bdIntervals = { save: null, check: null };
function escapeHtml(str) {
var div = document.createElement('div');
div.appendChild(document.createTextNode(str));
return div.innerHTML;
}
function countTasks(textarea) {
if (!textarea || !textarea.value) return 0;
return textarea.value.split('\n').filter(function (line) {
return line.trim();
}).length;
}
function todayStr() {
var d = new Date();
return (
d.getFullYear() +
'-' +
String(d.getMonth() + 1).padStart(2, '0') +
'-' +
String(d.getDate()).padStart(2, '0')
);
}
function _bdCleanup() {
clearInterval(_bdIntervals.save);
clearInterval(_bdIntervals.check);
_bdIntervals.save = null;
_bdIntervals.check = null;
}
async function openBrainDump() {
var projectsPromise = PluginAPI.getAllProjects();
var dataPromise = PluginAPI.loadSyncedData();
var results = await Promise.all([projectsPromise, dataPromise]);
var projects = results[0];
var savedData = results[1];
var draft = {};
if (savedData) {
try {
draft = JSON.parse(savedData);
} catch (e) {
/* ignore corrupt draft */
}
}
var savedText = draft.text || '';
var inboxProject = projects.find(function (p) {
return p.id === 'INBOX_PROJECT';
});
var savedProjectId = draft.projectId || (inboxProject ? inboxProject.id : '');
var savedDueDay = draft.dueDay !== undefined ? draft.dueDay : todayStr();
var activeProjects = projects.filter(function (p) {
return !p.isArchived;
});
var projectOptions = activeProjects
.map(function (p) {
return (
''
);
})
.join('');
var html =
'
' +
'
' +
'
' +
'
' +
'
' +
'
' +
'
' +
'
' +
'' +
'' +
'
' +
'
' +
'
' +
'
' +
'
' +
'
';
var lastSavedText = savedText;
PluginAPI.openDialog({
title: 'Brain Dump',
htmlContent: html,
buttons: [
{
label: 'Cancel',
onClick: function () {
_bdCleanup();
return saveDraft();
},
},
{
label: 'Add Tasks',
color: 'primary',
icon: 'add',
raised: true,
onClick: function () {
_bdCleanup();
return submitTasks();
},
},
],
});
// Periodic draft save (only on change) + theme color update + status update
_bdIntervals.save = setInterval(function () {
var textarea = document.getElementById('bd-input');
if (textarea && textarea.value !== lastSavedText) {
lastSavedText = textarea.value;
saveDraft();
}
updateThemeColor(activeProjects);
updateStatus();
}, 2000);
_bdIntervals.check = setInterval(function () {
if (!document.getElementById('bd-input')) {
_bdCleanup();
}
}, 1000);
// Initial updates
setTimeout(function () {
updateThemeColor(activeProjects);
updateStatus();
}, 100);
}
function updateStatus() {
var textarea = document.getElementById('bd-input');
var statusEl = document.getElementById('bd-status');
if (!statusEl) return;
var count = countTasks(textarea);
if (count === 0) {
statusEl.textContent = 'One task per line. Empty lines are skipped.';
} else {
statusEl.textContent = count + ' task' + (count !== 1 ? 's' : '') + ' to add';
}
}
function updateThemeColor(activeProjects) {
var select = document.getElementById('bd-project');
var colorBar = document.getElementById('bd-color-bar');
if (!select || !colorBar) return;
var project = activeProjects.find(function (p) {
return p.id === select.value;
});
if (project && project.theme && project.theme.primary) {
colorBar.style.background = project.theme.primary;
} else {
colorBar.style.background = 'transparent';
}
}
async function saveDraft() {
var textarea = document.getElementById('bd-input');
var select = document.getElementById('bd-project');
var dueInput = document.getElementById('bd-due');
if (textarea) {
await PluginAPI.persistDataSynced(
JSON.stringify({
text: textarea.value,
projectId: select ? select.value : '',
dueDay: dueInput ? dueInput.value : '',
}),
);
}
}
async function submitTasks() {
var textarea = document.getElementById('bd-input');
var select = document.getElementById('bd-project');
var dueInput = document.getElementById('bd-due');
if (!textarea) return;
var lines = textarea.value.split('\n').filter(function (line) {
return line.trim();
});
if (lines.length === 0) {
PluginAPI.showSnack({
msg: 'Nothing to add — enter at least one task.',
type: 'WARNING',
});
return;
}
var projectId = select ? select.value : null;
var dueDay = dueInput ? dueInput.value : null;
for (var i = 0; i < lines.length; i++) {
var taskData = { title: lines[i].trim() };
if (projectId) {
taskData.projectId = projectId;
}
if (dueDay) {
taskData.dueDay = dueDay;
}
await PluginAPI.addTask(taskData);
}
// Clear textarea and draft
textarea.value = '';
await PluginAPI.persistDataSynced(
JSON.stringify({ text: '', projectId: '', dueDay: '' }),
);
PluginAPI.showSnack({
msg: lines.length + ' task' + (lines.length !== 1 ? 's' : '') + ' added',
type: 'SUCCESS',
ico: 'check',
});
}
// Register menu entry and shortcut
PluginAPI.registerMenuEntry({
label: 'Brain Dump',
icon: 'lightbulb',
onClick: openBrainDump,
});
PluginAPI.registerShortcut({
id: 'open-brain-dump',
label: 'Open Brain Dump',
onExec: openBrainDump,
});