monitme
Version:
Powerful task for developers
195 lines (175 loc) • 6.82 kB
JavaScript
var Store = require('./store'),
store = Store('tasks'),
command = require('./command');
store.init({
tasks: [],
account: null
});
command('add', 'Adds new task')
.option('-d, --done', 'Mark new added task as done')
.option('-b, --batch', 'Batch add tasks')
.action((args, options) => {
if (options.batch) {
command.log('Add tasks seperated by new line');
var tasks = [];
var task = '';
while ((task = command.rl.question('# ')).length) {
tasks.push(task);
}
tasks.forEach(description => {
var task = {
de: description,
co: false,
ca: Date.now(),
da: 0
};
store.set(d => d.tasks.push(task));
});
command.log(`${tasks.length} task(s) created.`);
} else {
var description = args.join(' ');
if (description.length == 0) {
description = command.rl.question('Describe new task: ');
if (description.length == 0) {
return;
}
}
var task = {
// Descriotion
de: description,
// Completed
co: options.done || false,
// Created at
ca: Date.now(),
// Completed at
da: 0
};
store.set(d => d.tasks.push(task));
}
});
command('rm', 'Remove task')
.option('-f, --force', 'Slient mode')
.action((args, options) => {
var index = parseInt(args[0]) - 1;
var task = store.get('tasks')[index];
if (task) {
command.log('This task will be removed:');
command.log(command.chalk.bgRed.white(task.de));
if (options.force || command.rl.keyInYN('Are you sure?')) {
store.set(d => d.tasks = d.tasks.filter((_, i) => i != index));
}
}
});
command('done', 'Mark task as completed')
.action((args) => {
var index = parseInt(args[0]) - 1;
var task = store.get('tasks')[index];
if (task) {
if (task.co) {
return command.log('The task is already completed');
}
store.set(d => {
d.tasks[index].co = true;
d.tasks[index].da = Date.now();
});
command.log('Congrlations! >_<');
command.log(command.chalk.bgGreen.white(`Completed: ${task.de}`));
}
});
command('undone', 'Mark task as not-completed')
.action((args) => {
var index = parseInt(args[0]) - 1;
var task = store.get('tasks')[index];
if (task) {
store.set(d => {
d.tasks[index].co = false;
d.tasks[index].da = 0;
});
command.log('Ok.');
}
});
command('clear', 'Remove all tasks')
.action(() => {
command.log('All tasks will be removed');
if (command.rl.keyInYN('Are you sure?') && command.rl.keyInYN('Are you sure, really?')) {
store.set('tasks', []);
command.log('Ok.');
}
});
command('', 'List tasks')
.option('-f, --filter', 'Filter completed tasks')
.option('-i, --interactive', 'Show interavtive task list')
.action((args, options) => {
var tasks = store.get('tasks'),
padLen = (tasks.length - 1).toString().length + 1;
if (tasks.length == 0) {
command.log(command.chalk.gray('Nothing to show :('));
command.log('Add your first task using:', command.chalk.bgGreen.black('task add'), 'command');
return;
}
if (options.interactive) {
var value = 0,
first = true,
page = 0,
lastPage = Math.ceil(tasks.length / 10),
lineWidth = 60;
command.log('Controls: W - UP, S - DOWN, SPACE - TOGGLE, N - PREV PAGE, M - NEXT PAGE, X - EXIT')
while (true) {
if (first) {
first = false;
} else {
command.log('\033[1A'.repeat(11));
}
var requiredItems = 10;
tasks.forEach((task, i) => {
if (requiredItems > 0 && i >= page * 10) {
requiredItems--;
var line = task.de;
if (line.length < lineWidth) {
line += ' '.repeat(lineWidth - line.length);
} else if (line.length > lineWidth) {
line = line.substr(0, lineWidth - 3) + '...';
}
command.log(i == value
? command.chalk.bgBlue[task.co ? 'gray' : 'yellowBright'](line)
: command.chalk[task.co ? 'gray' : 'yellowBright'](line));
}
});
for (var i=0; i<requiredItems; i++) command.log(' '.repeat(lineWidth));
var key = command.rl.keyIn('', { hideEchoBack: true, mask: '', limit: 'wsxmn ' });
switch (key) {
case 'w':
if (value > page*10) value--;
break;
case 's':
if (value < tasks.length - 1 && value < page*10 + 9) value++;
break;
case ' ':
tasks[value].co = !tasks[value].co;
break;
case 'n':
if (page > 0) { page--; value=page*10; }
break;
case 'm':
if (page < lastPage) { page++; value=page*10; }
break;
default:
store.set('tasks', tasks);
return;
}
}
} else {
tasks.forEach((task, index) => {
if (!options.filter || !task.co) {
var line = `${(index + 1 + '.').padEnd(padLen)} ${task.de}`;
if (task.co) {
command.log(command.chalk.gray(line));
} else {
command.log(command.chalk.yellowBright(line));
}
}
});
}
});
store.commit();