UNPKG

monitme

Version:

Powerful task for developers

195 lines (175 loc) 6.82 kB
#!/usr/bin/env node 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();