From 3fe4f95d642d9117d0221049795bd713f893b8a4 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:05:29 +0800 Subject: [PATCH 01/10] formated with prettier, added prettier --- .gitignore | 4 +- .jscsrc | 77 -------------------------------- .prettierrc | 13 ++++++ package.json | 96 ++++++++++++++++++++-------------------- src/autocomplete.js | 41 +++++++++++++---- src/core/dbMigrations.js | 44 +++++++++--------- src/exports.js | 4 +- yarn.lock | 14 ++++-- 8 files changed, 131 insertions(+), 162 deletions(-) delete mode 100644 .jscsrc create mode 100644 .prettierrc diff --git a/.gitignore b/.gitignore index b512c09..92424d1 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -node_modules \ No newline at end of file +node_modules +backup.json +test.md diff --git a/.jscsrc b/.jscsrc deleted file mode 100644 index 018e9d5..0000000 --- a/.jscsrc +++ /dev/null @@ -1,77 +0,0 @@ -{ - "esnext": true, - "disallowSpacesInNamedFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInAnonymousFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInFunctionDeclaration": { - "beforeOpeningRoundBrace": true - }, - "disallowEmptyBlocks": true, - "disallowSpacesInCallExpression": true, - "disallowSpacesInsideArrayBrackets": true, - "disallowSpacesInsideParentheses": true, - "disallowQuotedKeysInObjects": true, - "disallowSpaceAfterObjectKeys": true, - "disallowSpaceAfterPrefixUnaryOperators": true, - "disallowSpaceBeforePostfixUnaryOperators": true, - "disallowSpaceBeforeBinaryOperators": [ - "," - ], - "disallowMixedSpacesAndTabs": true, - "disallowTrailingWhitespace": true, - "disallowYodaConditions": true, - "disallowKeywords": [ - "with" - ], - "disallowKeywordsOnNewLine": [ - "else" - ], - "disallowMultipleLineBreaks": true, - "disallowMultipleLineStrings": true, - "disallowMultipleVarDecl": true, - "disallowSpaceBeforeComma": true, - "disallowSpaceBeforeSemicolon": true, - "requireSpaceBeforeBlockStatements": true, - "requireParenthesesAroundIIFE": true, - "requireSpacesInConditionalExpression": true, - "requireBlocksOnNewline": 1, - "requireCommaBeforeLineBreak": true, - "requireSpaceBeforeBinaryOperators": true, - "requireSpaceAfterBinaryOperators": true, - "requireCamelCaseOrUpperCaseIdentifiers": true, - "requireLineFeedAtFileEnd": true, - "requireCapitalizedConstructors": true, - "requireDotNotation": true, - "requireSpacesInForStatement": true, - "requireSpaceBetweenArguments": true, - "requireCurlyBraces": [ - "do" - ], - "requireSpaceAfterKeywords": [ - "if", - "else", - "for", - "while", - "do", - "switch", - "case", - "return", - "try", - "catch", - "typeof" - ], - "requirePaddingNewLinesBeforeLineComments": { - "allExcept": "firstAfterCurly" - }, - "requirePaddingNewLinesAfterBlocks": true, - "disallowSemicolons": true, - "safeContextKeyword": "_this", - "validateQuoteMarks": "'", - "validateIndentation": 4 -} diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..4bada0e --- /dev/null +++ b/.prettierrc @@ -0,0 +1,13 @@ +{ + "tabWidth": 4, + "singleQuote": true, + "semi": false, + "overrides": [ + { + "files": "*.json", + "options": { + "printWidth": 99999999999999999 + } + } + ] +} diff --git a/package.json b/package.json index b83a85a..8e502cf 100644 --- a/package.json +++ b/package.json @@ -1,50 +1,50 @@ { - "name": "time-tracker-cli", - "version": "2.3.1", - "description": "Tiny time tracker", - "keywords": [ - "time", - "tracker", - "timer", - "cli", - "time log", - "time logger", - "logger" - ], - "bin": { - "timer": "./bin/timer" - }, - "main": "./lib/exports", - "scripts": { - "build": "node_modules/.bin/babel -s -d lib src", - "dev": "npm run build -- -w", - "test": "mocha -R spec --require source-map-support/register lib/__test__/*.spec.js ", - "test:dev": "npm run test -- -w", - "postinstall": "timer --updateDB" - }, - "repository": { - "type": "git", - "url": "https://github.com/danibram/time-tracker-cli" - }, - "author": "Daniel Biedma ", - "license": "ISC", - "devDependencies": { - "babel": "^6.3.26", - "babel-cli": "^6.26.0", - "babel-plugin-transform-decorators-legacy": "^1.3.4", - "babel-preset-es2015": "^6.22.0", - "babel-preset-stage-0": "^6.22.0" - }, - "dependencies": { - "babel-polyfill": "^6.26.0", - "cli-table2": "^0.2.0", - "colors": "^1.1.2", - "commander": "^2.11.0", - "configstore": "^3.1.1", - "flat": "^4.0.0", - "inquirer": "^3.3.0", - "moment": "^2.19.1", - "omelette": "^0.4.5", - "update-notifier": "^2.3.0" - } + "name": "time-tracker-cli", + "version": "2.5.0", + "description": "Tiny time tracker", + "keywords": [ + "time", + "tracker", + "timer", + "cli", + "time log", + "time logger", + "logger" + ], + "bin": { + "timer": "./bin/timer" + }, + "main": "./lib/exports", + "scripts": { + "build": "node_modules/.bin/babel -s -d lib src", + "dev": "npm run build -- -w", + "test": "mocha -R spec --require source-map-support/register lib/__test__/*.spec.js ", + "test:dev": "npm run test -- -w" + }, + "repository": { + "type": "git", + "url": "https://github.com/danibram/time-tracker" + }, + "author": "Daniel Biedma ", + "license": "ISC", + "devDependencies": { + "babel": "^6.3.26", + "babel-cli": "^6.26.0", + "babel-plugin-transform-decorators-legacy": "^1.3.4", + "babel-preset-es2015": "^6.22.0", + "babel-preset-stage-0": "^6.22.0", + "prettier": "^1.10.2" + }, + "dependencies": { + "babel-polyfill": "^6.26.0", + "cli-table2": "^0.2.0", + "colors": "^1.1.2", + "commander": "^2.14.1", + "configstore": "^3.1.1", + "flat": "^4.0.0", + "inquirer": "^3.3.0", + "moment": "^2.20.1", + "omelette": "^0.4.5", + "update-notifier": "^2.3.0" + } } diff --git a/src/autocomplete.js b/src/autocomplete.js index c0ef19a..835c272 100644 --- a/src/autocomplete.js +++ b/src/autocomplete.js @@ -1,21 +1,44 @@ import omelette from 'omelette' import { configElements } from './core/constants' -const autocomplete = function(config){ +const autocomplete = function(config) { let taskKeys = Object.keys(config.all.tasks) const complete = omelette('timer ') - complete.on("action",({ reply }) => { - reply(["start", "pause", "unpause", "finish", "description", "add", "subtract", "report", "log", "export", "delete", "configuration", "configure"]); - }); - - complete.on("tasks", ({ reply, before }) =>{ - let keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove'] + complete.on('action', ({ reply }) => { + reply([ + 'start', + 'pause', + 'unpause', + 'finish', + 'description', + 'add', + 'subtract', + 'report', + 'log', + 'export', + 'delete', + 'configuration', + 'configure' + ]) + }) - if (keyTasks.indexOf(before) > -1){ + complete.on('tasks', ({ reply, before }) => { + let keyTasks = [ + 'start', + 'pause', + 'unpause', + 'finish', + 'log', + 'description', + 'add', + 'remove' + ] + + if (keyTasks.indexOf(before) > -1) { reply(taskKeys) - } else if (before === 'configure' ){ + } else if (before === 'configure') { reply(configElements) } }) diff --git a/src/core/dbMigrations.js b/src/core/dbMigrations.js index 020b5fe..3f245b7 100644 --- a/src/core/dbMigrations.js +++ b/src/core/dbMigrations.js @@ -1,32 +1,32 @@ -export const migrateToV2 = function (tasks){ +export const migrateToV2 = function(tasks) { let promises = [] - let migrate = (key, task) => new Promise((resolve, reject) => { + let migrate = (key, task) => + new Promise((resolve, reject) => { + let timing = {} + let update = false - let timing = {} - let update = false + if (task.start) { + update = true + timing.start = task.start + delete task.start + } - if (task.start) { - update = true - timing.start = task.start - delete task.start - } + if (task.stop) { + timing.stop = task.stop + delete task.stop + } - if (task.stop) { - timing.stop = task.stop - delete task.stop - } + if (update) { + task.timings = [timing] + } - if (update) { - task.timings = [timing] - } - - resolve({ - key, - task + resolve({ + key, + task + }) }) - }) - Object.keys(tasks).forEach(k => promises.push( migrate(k, tasks[k]) )) + Object.keys(tasks).forEach(k => promises.push(migrate(k, tasks[k]))) return Promise.all(promises) } diff --git a/src/exports.js b/src/exports.js index 5ac49c9..9964cd0 100644 --- a/src/exports.js +++ b/src/exports.js @@ -4,8 +4,8 @@ import Configstore from 'configstore' import pkg from '../package.json' const config = new Configstore(pkg.name, { - tasks:{}, - config:{ + tasks: {}, + config: { 'format.output': 'DD/MM' } }) diff --git a/yarn.lock b/yarn.lock index dfd4d16..5b5867b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -898,6 +898,10 @@ commander@^2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" +commander@^2.14.1: + version "2.14.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -1596,9 +1600,9 @@ minimist@^1.2.0: dependencies: minimist "0.0.8" -moment@^2.19.1: - version "2.19.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.1.tgz#56da1a2d1cbf01d38b7e1afc31c10bcfa1929167" +moment@^2.20.1: + version "2.20.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd" ms@2.0.0: version "2.0.0" @@ -1762,6 +1766,10 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" +prettier@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.10.2.tgz#1af8356d1842276a99a5b5529c82dd9e9ad3cc93" + private@^0.1.6, private@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" From 1766ffa13617dc8ac8609ce12c359e995329dd7e Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:05:53 +0800 Subject: [PATCH 02/10] move markdoen to outputs, and added expanded option --- src/core/output.js | 180 ++++++++++++++++++++++++++++++++------------- 1 file changed, 127 insertions(+), 53 deletions(-) diff --git a/src/core/output.js b/src/core/output.js index f7d8477..4971edd 100644 --- a/src/core/output.js +++ b/src/core/output.js @@ -2,35 +2,36 @@ import moment from 'moment' import Table from 'cli-table2' import colors from 'colors' -import { humanParseDiff, calcRate } from './utils' +import { humanParseDiff, calcRate, getSeconds } from './utils' export const sumarize = function(search, tasks, rate, full, format) { let table = new Table({ - head: ['Name','Description', 'Dates', 'Duration'], + head: ['Name', 'Description', 'Dates', 'Duration'], colAligns: ['left', 'center', 'center', 'left'], chars: { - 'top': '═' - , 'top-mid': '╤' - , 'top-left': '╔' - , 'top-right': '╗' - , 'bottom': '═' - , 'bottom-mid': '╧' - , 'bottom-left': '╚' - , 'bottom-right': '╝' - , 'left': '║' - , 'left-mid': '╟' - , 'right': '║' - , 'right-mid': '╢' - }, + top: '═', + 'top-mid': '╤', + 'top-left': '╔', + 'top-right': '╗', + bottom: '═', + 'bottom-mid': '╧', + 'bottom-left': '╚', + 'bottom-right': '╝', + left: '║', + 'left-mid': '╟', + right: '║', + 'right-mid': '╢' + }, style: { head: ['green'] } - }); + }) let total = 0 - let head= `Search: ${search} \n` + let head = `Search: ${search} \n` tasks.forEach((task, index) => { - let description = (task.task.description() && task.task.description() !== '') - ? task.task.description() - : '-' + let description = + task.task.description() && task.task.description() !== '' + ? task.task.description() + : '-' let name = task.name task = task.task @@ -42,8 +43,8 @@ export const sumarize = function(search, tasks, rate, full, format) { let arr = [] while (str != '') { if (str.length > len) { - arr.push(str.substring(0,len)) - str = str.substring(len); + arr.push(str.substring(0, len)) + str = str.substring(len) } else { arr.push(str) break @@ -54,67 +55,90 @@ export const sumarize = function(search, tasks, rate, full, format) { description = splitWidth(description, 51) name = splitWidth(name, 40) - table.push([name, description, moment(task.getStartDate()).format(format), humanParseDiff(duration)]) + table.push([ + name, + description, + moment(task.getStartDate()).format(format), + humanParseDiff(duration) + ]) }) - if (full){ + if (full) { table.push([]) - if (rate){ + if (rate) { table.push( - [{ rowSpan:2, content: `${colors.red('Search:')} "${search}"`, vAlign:'center'}, colors.red('Total time'), humanParseDiff(total)], - [ colors.red('Rate'), calcRate(rate, total)] + [ + { + rowSpan: 2, + content: `${colors.red('Search:')} "${search}"`, + vAlign: 'center' + }, + colors.red('Total time'), + humanParseDiff(total) + ], + [colors.red('Rate'), calcRate(rate, total)] ) } else { table.push( [ - { rowSpan:2, content: `${colors.red('Search:')} "${search}"`, vAlign:'center' }, - { rowSpan:2, content: '', vAlign:'center' }, - { rowSpan:2, content: colors.red('Total time'), vAlign:'center' }, - { rowSpan:2, content: humanParseDiff(total), vAlign:'center' } + { + rowSpan: 2, + content: `${colors.red('Search:')} "${search}"`, + vAlign: 'center' + }, + { rowSpan: 2, content: '', vAlign: 'center' }, + { + rowSpan: 2, + content: colors.red('Total time'), + vAlign: 'center' + }, + { + rowSpan: 2, + content: humanParseDiff(total), + vAlign: 'center' + } ], [] ) } } - console.log(table.toString()); + console.log(table.toString()) } -export const outputConfig = function (config){ +export const outputConfig = function(config) { let table = new Table({ head: ['Key', 'value'], chars: { - 'top': '═' - , 'top-mid': '╤' - , 'top-left': '╔' - , 'top-right': '╗' - , 'bottom': '═' - , 'bottom-mid': '╧' - , 'bottom-left': '╚' - , 'bottom-right': '╝' - , 'left': '║' - , 'left-mid': '╟' - , 'right': '║' - , 'right-mid': '╢' + top: '═', + 'top-mid': '╤', + 'top-left': '╔', + 'top-right': '╗', + bottom: '═', + 'bottom-mid': '╧', + 'bottom-left': '╚', + 'bottom-right': '╝', + left: '║', + 'left-mid': '╟', + right: '║', + 'right-mid': '╢' }, colAligns: ['center', 'center'], style: { head: ['green'] } - }); + }) Object.keys(config).map(e => table.push([e, config[e]])) - console.log(table.toString()); + console.log(table.toString()) } -export const outputVertical = function (...args){ +export const outputVertical = function(...args) { let table2 = new Table() - let key = args.splice(0, 1) - table2.push( - { [key]: args }, - ) + let key = args.splice(0, 1) + table2.push({ [key]: args }) - return table2.toString() + return table2.toString() } export const cliError = function(err) { @@ -124,3 +148,53 @@ export const cliError = function(err) { export const cliSuccess = function(err) { console.log(colors.green(err)) } + +export const markdown = function(tasks, expanded = false) { + let body = '| Start | End | Hours | Subtotal | Description |\n' + body += '| ----- | --- | -----:| -------: | ----------- |\n' + let total = 0 + + //tasks = start || end ? this.filterDates(tasks, start, end) : tasks; + tasks.forEach(task => { + let name = task.name + task = task.task + + if (!task.filtered) { + let duration = task.getSeconds() + total += duration + + if (expanded && task.task.timings.length > 1) { + let subtotal = 0 + let times = 0 + + task.task.timings.forEach(timing => { + let secs = getSeconds(timing) + subtotal += secs + times += 1 + body += + `|${moment(timing.start).format('YYYY/MM/DD kk:mm')}` + + `|${moment(timing.stop).format('YYYY/MM/DD kk:mm')}` + + `|${humanParseDiff(secs)}` + + `|${humanParseDiff(subtotal)}` + + `|${name} (part ${times})` + + `|\n` + }) + } else { + let start = task.getStartDate() + let stop = task.getEndDate() + + body += + `|${moment(start).format('YYYY/MM/DD kk:mm')}` + + `|${moment(stop).format('YYYY/MM/DD kk:mm')}` + + `|${humanParseDiff(duration)}` + + `|${humanParseDiff(total)}` + + `|${name}` + + `|\n` + } + } + }) + body += '| | | |\n' + body += `| Total | | ${humanParseDiff(total)} | | |\n` + + return body +} From 36b3ad45cfd608afdfc85d4467ac79ad7426c5a4 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:06:11 +0800 Subject: [PATCH 03/10] added new expanded options on export --- src/index.js | 69 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/src/index.js b/src/index.js index b1ddd58..5823c41 100644 --- a/src/index.js +++ b/src/index.js @@ -12,8 +12,8 @@ import { outputVertical, cliError, outputConfig } from './core/output' import autocomplete from './autocomplete' const config = new Configstore(pkg.name, { - tasks:{}, - config:{ + tasks: {}, + config: { 'format.output': 'DD/MM' } }) @@ -36,7 +36,9 @@ program .description('Start task with a description.') .alias('s') .action(function(key, description) { - description = (description) ? Array.isArray(description) ? description.join(' ') : description : null + description = description + ? Array.isArray(description) ? description.join(' ') : description + : null manager.startTask(key, description) EXEC = true }) @@ -59,13 +61,14 @@ program EXEC = true }) - program .command('finish [description]') .description('Stop task, you can add a description') .alias('f') .action(function(key, description) { - description = (description) ? Array.isArray(description) ? description.join(' ') : description : null + description = description + ? Array.isArray(description) ? description.join(' ') : description + : null manager.stopTask(key, description) EXEC = true }) @@ -101,10 +104,12 @@ program program .command('report [task_string] [rate]') - .description('Report time of the tasks, empty for select all tasks. Can pass a rate (1h).') + .description( + 'Report time of the tasks, empty for select all tasks. Can pass a rate (1h).' + ) .alias('r') .action(function(tasks, rate) { - tasks = (tasks) ? tasks : 'all' + tasks = tasks ? tasks : 'all' manager.sumarize(tasks, rate) EXEC = true }) @@ -115,9 +120,13 @@ program .alias('l') .action(function(key) { setInterval(() => { - let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key))) + let text = outputVertical( + 'Task:', + key, + humanParseDiff(manager.getTime(key)) + ) process.stdout.write(text) - process.stdout.moveCursor(0,-2) + process.stdout.moveCursor(0, -2) }, 1000) EXEC = true }) @@ -129,17 +138,33 @@ program .option('-f --format [format]') .option('-s --start [start date. Example: "2017/05/28"]') .option('-e --end [end date. Example: "2018/05/28"]') + .option('-x --expanded [You want to see all timings for a task.]') .action(function(key, options) { - switch (options.format ? options.format.toLowerCase() : undefined){ - case "json": case undefined: - console.log(JSON.stringify(manager.getTasksJson(key, options.start, options.end), null, 4)) - break - case "markdown": case "md": - console.log(manager.getTasksMd(key, options.start, options.end)) - break - default: - console.log("Format not supported") - } + switch (options.format ? options.format.toLowerCase() : undefined) { + case 'json': + case undefined: + console.log( + JSON.stringify( + manager.getTasksJson(key, options.start, options.end), + null, + 4 + ) + ) + break + case 'markdown': + case 'md': + console.log( + manager.getTasksMd( + key, + options.start, + options.end, + options.expanded + ) + ) + break + default: + console.log('Format not supported') + } EXEC = true }) @@ -148,7 +173,7 @@ program .description('Remove tasks from the list. Empty for select all tasks') .alias('del') .action(function(string) { - string = (string) ? string : 'all' + string = string ? string : 'all' manager.delete(string) EXEC = true }) @@ -169,9 +194,7 @@ program EXEC = true }) -program - .parse(process.argv) - +program.parse(process.argv) if (program.updateDB) { manager.update() From 39dcef942770991443d7d8ece8e2970b7e53f82a Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:07:08 +0800 Subject: [PATCH 04/10] Some tweaks and rework on filtering --- src/core/Task.js | 150 +++++++++++++++++++++++++++++++---------------- 1 file changed, 101 insertions(+), 49 deletions(-) diff --git a/src/core/Task.js b/src/core/Task.js index b7b08b2..473e676 100644 --- a/src/core/Task.js +++ b/src/core/Task.js @@ -1,45 +1,40 @@ import moment from 'moment' import { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants' -import { recognizeModifierTiming } from './utils' +import { recognizeModifierTiming, inPeriod, getSeconds } from './utils' import { cliError } from './output' - +import { EINPROGRESS } from 'constants' export default class Task { - constructor(task){ - this.task = (task) ? task : { - description: '', - timings: [] - } + constructor(task) { + this.task = task + ? task + : { + description: '', + timings: [] + } + this.filtered = false } - _calcTime(t){ - if (t.stop) { - return moment(t.stop).diff(moment(t.start), 'seconds') - } else { - return moment().diff(moment(t.start), 'seconds') - } - } - - _modifyTiming(time, operation){ + _modifyTiming(time, operation) { let timing = this.task.timings[this.task.timings.length - 1] - if (!timing){ - throw (`This task is not started, start it.`) + if (!timing) { + throw `This task is not started, start it.` } let newStop = moment(timing.stop) newStop = newStop[operation](time.value, time.momentKey) - if (operation === 'subtract' && newStop.isBefore(timing.start)){ - throw('You cant subtract more time') + if (operation === 'subtract' && newStop.isBefore(timing.start)) { + throw 'You cant subtract more time' return } this.task.timings[this.task.timings.length - 1].stop = newStop } - start(description){ - return new Promise((resolve, reject)=>{ + start(description) { + return new Promise((resolve, reject) => { let started = false let timing = this.task.timings[this.task.timings.length - 1] @@ -59,11 +54,11 @@ export default class Task { }) } - pause(){ - return new Promise((resolve, reject)=>{ + pause() { + return new Promise((resolve, reject) => { let timing = this.task.timings[this.task.timings.length - 1] - if (!timing){ + if (!timing) { reject(this.error(`This task is not started, start it.`)) } @@ -71,17 +66,19 @@ export default class Task { reject(this.error(`This task are ended/paused, unpaused it.`)) } - this.task.timings[this.task.timings.length - 1].stop = moment().toDate() + this.task.timings[ + this.task.timings.length - 1 + ].stop = moment().toDate() this.setStatus(PAUSED) this.log('pause') resolve() }) } - unpause(){ - return new Promise((resolve, reject)=>{ + unpause() { + return new Promise((resolve, reject) => { let timing = this.task.timings[this.task.timings.length - 1] - if (!timing){ + if (!timing) { reject(this.error(`This task is not started, start it`)) } @@ -98,10 +95,10 @@ export default class Task { }) } - stop (description){ - return new Promise((resolve, reject)=>{ + stop(description) { + return new Promise((resolve, reject) => { let timing = this.task.timings[this.task.timings.length - 1] - if (!timing || timing && !timing.start){ + if (!timing || (timing && !timing.start)) { reject(this.error(`This task is not started, start it`)) } @@ -109,7 +106,9 @@ export default class Task { reject(this.error(`This task already ended, start/unpause it.`)) } - this.task.timings[this.task.timings.length - 1].stop = moment().toDate() + this.task.timings[ + this.task.timings.length - 1 + ].stop = moment().toDate() this.setDescription(description) this.setStatus(FINISHED) this.log('stop') @@ -117,23 +116,25 @@ export default class Task { }) } - log(operation){ - if (!this.task.log){ + log(operation) { + if (!this.task.log) { this.task.log = [] } this.task.log.push(`${operation}#${moment().toISOString()}`) } - description(){ + description() { return this.task.description } - setDescription(text){ - this.task.description = (text) ? text : (this.task.description) ? this.task.description : '' + setDescription(text) { + this.task.description = text + ? text + : this.task.description ? this.task.description : '' } - setStatus(status){ + setStatus(status) { this.task.status = status } @@ -142,10 +143,10 @@ export default class Task { let parsed = recognizeModifierTiming(stringTime) try { - parsed.map((t)=>{ + parsed.map(t => { this._modifyTiming(t, operation) }) - } catch(err){ + } catch (err) { console.error(err) reject(this.error(`Error trying to ${operation} time to task`)) } @@ -155,33 +156,84 @@ export default class Task { }) } - get(){ + get() { return this.task } - getSeconds(){ + filterByDates(start, end) { + if (this.task.timings) { + if (start && end) { + this.task.timings = this._filterTimingsByDate(start, end) + } else if (start) { + end = moment().format('YYYY/MM/DD') + this.task.timings = this._filterTimingsByDate(start, end) + } else if (end) { + start = moment(0).format('YYYY/MM/DD') + this.task.timings = this._filterTimingsByDate(start, end) + } + + if (this.task.timings.length === 0) { + this.filtered = true + } + } else { + let t = inPeriod(this.task.start, this.task.stop, start, end) + if (t.isBetween) { + this.task.start = t.start + this.task.stop = t.stop + } else { + this.filtered = true + } + } + + return this + } + + _filterTimingsByDate(start, end) { + return this.task.timings.reduce((acc, val) => { + let t = inPeriod(val.start, val.stop, start, end) + if (t.isBetween) { + acc.push({ + start: t.start, + stop: t.stop + }) + } + return acc + }, []) + } + + getSeconds() { let duration = 0 - if (this.task.timings){ + if (this.task.timings) { this.task.timings.forEach(timing => { - duration += this._calcTime(timing) + duration += getSeconds(timing) }) } else { - duration = this._calcTime(this.task) + duration = getSeconds(this.task) } return duration } - getStartDate(){ - if (this.task.timings && this.task.timings[0]){ + getStartDate() { + if (this.task.timings && this.task.timings[0]) { return this.task.timings[0].start } else { return this.task.start } } - error(err){ + getEndDate() { + if (this.task.timings) { + return this.task.timings[this.task.timings.length - 1].stop + } else if (this.task.stop) { + return this.task.stop + } else { + return moment().toDate() + } + } + + error(err) { return err //+ ` \n Task: ${JSON.stringify(this.task)}` } } From d9a6247381684a1b2798564103e61192f29bac96 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:07:30 +0800 Subject: [PATCH 05/10] remove unflattered tasks in favour to use search --- src/core/Manager.js | 244 +++++++++++++++++++++----------------------- 1 file changed, 114 insertions(+), 130 deletions(-) diff --git a/src/core/Manager.js b/src/core/Manager.js index e628fd1..2ef3d1c 100644 --- a/src/core/Manager.js +++ b/src/core/Manager.js @@ -3,27 +3,39 @@ import moment from 'moment' import inquirer from 'inquirer' import Task from './Task' -import { recognizeModifierTiming } from './utils' -import { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED, configElements } from './constants' -import { sumarize, outputVertical, cliError, cliSuccess } from './output' +import { recognizeModifierTiming, humanParseDiff, getSeconds } from './utils' +import { + STARTED, + PAUSED, + UNPAUSED, + IN_PROGRESS, + FINISHED, + configElements +} from './constants' +import { + sumarize, + outputVertical, + cliError, + cliSuccess, + markdown +} from './output' import { migrateToV2 } from './dbMigrations' export default class Manager { - repositories = ['tasks', 'config'] constructor(cfg) { this.cfg = cfg this.tasks = cfg.all.tasks - this.config = (cfg.all.config) ? cfg.all.config : {} + this.config = cfg.all.config ? cfg.all.config : {} } getTask(key) { - let task = (this.tasks[key]) ? this.tasks[key] : null + let task = this.tasks[key] ? this.tasks[key] : null return new Task(task) } - storeTask(key, task){ + storeTask(key, task) { let update = {} update[key] = task.get() this.tasks = Object.assign({}, this.tasks, update) @@ -32,20 +44,27 @@ export default class Manager { startTask(key, description) { let t = this.getTask(key) - t.start(description) + t + .start(description) .then(() => { this.storeTask(key, t) console.log( - outputVertical('Task:', key, STARTED, moment().toISOString()) + outputVertical( + 'Task:', + key, + STARTED, + moment().toISOString() + ) ) }, cliError) .catch(cliError) } - pauseTask(key){ + pauseTask(key) { let t = this.getTask(key) - t.pause() - .then(()=>{ + t + .pause() + .then(() => { this.storeTask(key, t) console.log( outputVertical('Task:', key, PAUSED, moment().toISOString()) @@ -54,13 +73,19 @@ export default class Manager { .catch(cliError) } - unpauseTask(key){ + unpauseTask(key) { let t = this.getTask(key) - t.unpause() - .then(()=>{ + t + .unpause() + .then(() => { this.storeTask(key, t) console.log( - outputVertical('Task:', key, UNPAUSED, moment().toISOString()) + outputVertical( + 'Task:', + key, + UNPAUSED, + moment().toISOString() + ) ) }, cliError) .catch(cliError) @@ -68,17 +93,23 @@ export default class Manager { stopTask(key, description) { let t = this.getTask(key) - t.stop(description) - .then(()=>{ + t + .stop(description) + .then(() => { this.storeTask(key, t) console.log( - outputVertical('Task:', key, FINISHED, moment().toISOString()) + outputVertical( + 'Task:', + key, + FINISHED, + moment().toISOString() + ) ) }, cliError) .catch(cliError) } - addDescription(key, text){ + addDescription(key, text) { let t = this.getTask(key) t.setDescription(text) this.storeTask(key, t) @@ -89,20 +120,21 @@ export default class Manager { return t.getSeconds() } - modifyTask(operation, name, stringTime){ + modifyTask(operation, name, stringTime) { let t = this.getTask(name) - t.makeOperationOverTime(operation, stringTime) - .then(()=>{ + t + .makeOperationOverTime(operation, stringTime) + .then(() => { this.storeTask(name, t) }, cliError) .catch(cliError) } - search(string) { + search(string = 'all') { let keys = Object.keys(this.tasks) let tasks = [] - keys.forEach((key)=>{ - if (string === 'all' || key.indexOf(string) > -1){ + keys.forEach(key => { + if (string === 'all' || key.indexOf(string) > -1) { tasks.push({ name: key, task: new Task(this.tasks[key]) @@ -115,121 +147,65 @@ export default class Manager { delete(string) { let tasks = this.search(string) - console.log( - tasks.map(k => `${k.name} \n`).join('') - ) + console.log(tasks.map(k => `${k.name} \n`).join('')) if (tasks.length === 0) { cliSuccess('No tasks found to delete.') return } - inquirer.prompt([{ - type: 'confirm', - name: 'cls', - message: `Are you sure you want to delete this tasks?`, - default: false - }]).then((answers) => { - if (answers.cls){ - tasks.forEach(k => { - delete this.tasks[k.name] - this.cfg.set('tasks', this.tasks) - }) - cliSuccess('Tasks deleted.') - } - }) - .catch(cliError) + inquirer + .prompt([ + { + type: 'confirm', + name: 'cls', + message: `Are you sure you want to delete this tasks?`, + default: false + } + ]) + .then(answers => { + if (answers.cls) { + tasks.forEach(k => { + delete this.tasks[k.name] + this.cfg.set('tasks', this.tasks) + }) + cliSuccess('Tasks deleted.') + } + }) + .catch(cliError) } getTasksJson(key) { - return flat.unflatten(key ? this.tasks[key]: this.tasks) + return flat.unflatten(key ? this.tasks[key] : this.tasks) } - getTasksMd(key, start, end) { - let timings - if(key){ - timings = this.tasks[key].timings - }else{ - timings = this.unflatTasks(this.tasks) - } - let body = "| Start | End | Hours | Subtotal | Description |\n" - body += "| ----- | --- | -----:| -------: | ----------- |\n" - let total = 0; + getTasksMd(key, start, end, expanded) { + let tasks + if (key) { + tasks = this.search(key) + } else { + tasks = this.search() + } - timings = start || end ? this.filterDates(timings, start, end) : timings - timings.forEach( k => { - let start = new Date(k.start) - let stop = k.stop ? new Date(k.stop) : new Date() - total += stop - start - body += "|" + this.dateFormat(start)+ "|" + this.dateFormat(stop)+ "|"+ this.hourFormat(stop - start)+ "|"+ this.hourFormat(total)+ "|" + k.name+ "|\n" - }) - body += "| | | |\n" - body += "| Total | | " + this.hourFormat(total)+ " | | |\n" + tasks.map(task => { + if (start || end) { + task = task.task.filterByDates(start, end) + } + return task + }) - return body + return markdown(tasks, expanded) } - filterDates(timings, start, end){ - let filterStart = function(timings){ - let filtered = [] - for(let i = 0; i < timings.length; i++){ - if(new Date(start) < new Date(timings[i].start)){ - filtered.push(timings[i]) - } - } - return filtered - } - let filterEnd = function(timings){ - let filtered = [] - for(let i = 0; i < timings.length; i++){ - if(new Date(end) > new Date(timings[i].start)){ - filtered.push(timings[i]) - } - } - return filtered - } - - return start && end ? filterStart(filterEnd(timings)) : (start ? filterStart(timings) : filterEnd(timings)) - } - unflatTasks(tasks){ - let keys = Object.keys(tasks) - let unflattened = [] - for(let i1 = 0; i1 < keys.length; i1++){ - for(let i2 = 0; i2 < tasks[keys[i1]].timings.length; i2++){ - let timing = tasks[keys[i1]].timings[i2] - timing.name = keys[i1] - timing.description = tasks[keys[i1]].description - unflattened.push(timing) - } - } - return unflattened - } - - dateFormat(d){ - let date = d.getFullYear() + "/" - let twoDigits = n => n < 10 ? "0" + n : n - date += twoDigits(d.getMonth()+1) + "/" - date += twoDigits(d.getDate()) + " " - date += twoDigits(d.getHours()) + ":" - date += twoDigits(d.getMinutes()) + ":" - date += twoDigits(d.getSeconds()) - return date - } - - hourFormat(d){ - let date = new Date(d) - let twoDigits = n => n < 10 ? "0" + n : n - return Math.floor(d / 36e5) + ":" + twoDigits(date.getMinutes()) + ":" + twoDigits(date.getSeconds()) - } - - getConfig(){ + getConfig() { return this.config } - configure(element, value){ - - if (configElements.indexOf(element) < 0){ - return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `) + configure(element, value) { + if (configElements.indexOf(element) < 0) { + return cliError( + `Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} ` + ) } let newCfg = { @@ -243,20 +219,26 @@ export default class Manager { } update() { - if (!this.config || (this.config && this.config['config.version'] !== '2') ){ + if ( + !this.config || + (this.config && this.config['config.version'] !== '2') + ) { console.log('DB: Need to be updated') migrateToV2(this.tasks) .then(tasks => { let newTasks = {} - tasks.forEach(t => newTasks[t.key] = t.task) + tasks.forEach(t => (newTasks[t.key] = t.task)) return newTasks }) .then(migratedTasks => { this.cfg.set('tasks', migratedTasks) - this.cfg.set('config', Object.assign(this.config, { - 'config.version': '2' - })) + this.cfg.set( + 'config', + Object.assign(this.config, { + 'config.version': '2' + }) + ) cliSuccess('Configuration migrated to version 2.') }, cliError) @@ -266,9 +248,11 @@ export default class Manager { } } - sumarize(key, rate, full=true){ + sumarize(key, rate, full = true) { let tasks = this.search(key) - tasks.sort((a,b) => { return a.name > b.name }) + tasks.sort((a, b) => { + return a.name > b.name + }) sumarize(key, tasks, rate, full, this.config['format.output']) } } From 78970b165bee69b6e4add259006db532576974fa Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:07:56 +0800 Subject: [PATCH 06/10] rework on filtering using moment, this can be changed in the future --- src/core/utils.js | 70 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 14 deletions(-) diff --git a/src/core/utils.js b/src/core/utils.js index 413b528..35dbb67 100644 --- a/src/core/utils.js +++ b/src/core/utils.js @@ -1,4 +1,6 @@ -export const recognizeModifierTiming = function (string){ +import moment from 'moment' + +export const recognizeModifierTiming = function(string) { let r = /(\d{1,})([hms])/g let arr let res = [] @@ -12,32 +14,72 @@ export const recognizeModifierTiming = function (string){ return res } -export const calcRate = function (rate, total){ +export const calcRate = function(rate, total) { let amount let mod = rate.substr(rate.length - 1) let value = rate.slice(0, rate.length - 1) switch (mod) { case 'h': - amount = (total/60/60)*parseFloat(value) - break; + amount = total / 60 / 60 * parseFloat(value) + break case 'm': - amount = (total/60)*parseFloat(value) - break; + amount = total / 60 * parseFloat(value) + break case 's': - amount = total*parseFloat(value) - break; + amount = total * parseFloat(value) + break } return amount.toFixed(2) } export const humanParseDiff = function(secs) { - let hours = Math.floor(secs / 3600) - let minutes = Math.floor((secs - (hours * 3600)) / 60) - let seconds = secs - (hours * 3600) - (minutes * 60) - hours = (hours == 0 ? '00h' : (hours < 10 ? '0' + hours : hours) + 'h') - minutes = ((minutes == 0 && hours == '') ? '00m' : (minutes < 10 ? '0' + minutes : minutes) + 'm') - seconds = (seconds == 0 ? '00s' : (seconds < 10 ? '0' + seconds : seconds) + 's') + let hours = Math.floor(secs / 3600) + let minutes = Math.floor((secs - hours * 3600) / 60) + let seconds = secs - hours * 3600 - minutes * 60 + hours = hours == 0 ? '00h' : (hours < 10 ? '0' + hours : hours) + 'h' + minutes = + minutes == 0 && hours == '' + ? '00m' + : (minutes < 10 ? '0' + minutes : minutes) + 'm' + seconds = + seconds == 0 ? '00s' : (seconds < 10 ? '0' + seconds : seconds) + 's' return `${hours} ${minutes} ${seconds}` } + +export const inPeriod = function(start, stop, fstart, fstop) { + fstart = moment(fstart, 'YYYY/MM/DD') + fstop = moment(fstop, 'YYYY/MM/DD') + + if ( + moment(start).isBetween(fstart, fstop, null, '[]') && + moment(stop).isBetween(fstart, fstop, null, '[]') + ) { + return { isBetween: true, start, stop } + } + + if ( + !moment(start).isBetween(fstart, fstop, null, '[]') && + moment(stop).isBetween(fstart, fstop, null, '[]') + ) { + return { isBetween: true, start: fstart, stop } + } + + if ( + moment(start).isBetween(fstart, fstop, null, '[]') && + !moment(stop).isBetween(fstart, fstop, null, '[]') + ) { + return { isBetween: true, start, stop: fstop } + } + + return { isBetween: false, start, stop } +} + +export const getSeconds = ({ start, stop }) => { + if (stop) { + return moment(stop).diff(moment(start), 'seconds') + } else { + return moment().diff(moment(start), 'seconds') + } +} From 5801e1cee9bd19b631082fc530637d794c6791e9 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:08:04 +0800 Subject: [PATCH 07/10] new release --- lib/core/Manager.js | 101 +++++++--------------------------------- lib/core/Manager.js.map | 2 +- lib/core/Task.js | 74 +++++++++++++++++++++++------ lib/core/Task.js.map | 2 +- lib/core/output.js | 70 +++++++++++++++++++++++----- lib/core/output.js.map | 2 +- lib/core/utils.js | 43 +++++++++++++++++ lib/core/utils.js.map | 2 +- lib/index.js | 12 +++-- lib/index.js.map | 2 +- 10 files changed, 191 insertions(+), 119 deletions(-) diff --git a/lib/core/Manager.js b/lib/core/Manager.js index 2abf5e0..64048e4 100644 --- a/lib/core/Manager.js +++ b/lib/core/Manager.js @@ -131,9 +131,11 @@ var Manager = function () { } }, { key: 'search', - value: function search(string) { + value: function search() { var _this6 = this; + var string = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'all'; + var keys = Object.keys(this.tasks); var tasks = []; keys.forEach(function (key) { @@ -184,92 +186,22 @@ var Manager = function () { } }, { key: 'getTasksMd', - value: function getTasksMd(key, start, end) { - var _this8 = this; - - var timings = void 0; + value: function getTasksMd(key, start, end, expanded) { + var tasks = void 0; if (key) { - timings = this.tasks[key].timings; + tasks = this.search(key); } else { - timings = this.unflatTasks(this.tasks); + tasks = this.search(); } - var body = "| Start | End | Hours | Subtotal | Description |\n"; - body += "| ----- | --- | -----:| -------: | ----------- |\n"; - var total = 0; - - timings = start || end ? this.filterDates(timings, start, end) : timings; - timings.forEach(function (k) { - var start = new Date(k.start); - var stop = k.stop ? new Date(k.stop) : new Date(); - total += stop - start; - body += "|" + _this8.dateFormat(start) + "|" + _this8.dateFormat(stop) + "|" + _this8.hourFormat(stop - start) + "|" + _this8.hourFormat(total) + "|" + k.name + "|\n"; - }); - body += "| | | |\n"; - body += "| Total | | " + this.hourFormat(total) + " | | |\n"; - return body; - } - }, { - key: 'filterDates', - value: function filterDates(timings, start, end) { - var filterStart = function filterStart(timings) { - var filtered = []; - for (var i = 0; i < timings.length; i++) { - if (new Date(start) < new Date(timings[i].start)) { - filtered.push(timings[i]); - } - } - return filtered; - }; - var filterEnd = function filterEnd(timings) { - var filtered = []; - for (var i = 0; i < timings.length; i++) { - if (new Date(end) > new Date(timings[i].start)) { - filtered.push(timings[i]); - } + tasks.map(function (task) { + if (start || end) { + task = task.task.filterByDates(start, end); } - return filtered; - }; + return task; + }); - return start && end ? filterStart(filterEnd(timings)) : start ? filterStart(timings) : filterEnd(timings); - } - }, { - key: 'unflatTasks', - value: function unflatTasks(tasks) { - var keys = Object.keys(tasks); - var unflattened = []; - for (var i1 = 0; i1 < keys.length; i1++) { - for (var i2 = 0; i2 < tasks[keys[i1]].timings.length; i2++) { - var timing = tasks[keys[i1]].timings[i2]; - timing.name = keys[i1]; - timing.description = tasks[keys[i1]].description; - unflattened.push(timing); - } - } - return unflattened; - } - }, { - key: 'dateFormat', - value: function dateFormat(d) { - var date = d.getFullYear() + "/"; - var twoDigits = function twoDigits(n) { - return n < 10 ? "0" + n : n; - }; - date += twoDigits(d.getMonth() + 1) + "/"; - date += twoDigits(d.getDate()) + " "; - date += twoDigits(d.getHours()) + ":"; - date += twoDigits(d.getMinutes()) + ":"; - date += twoDigits(d.getSeconds()); - return date; - } - }, { - key: 'hourFormat', - value: function hourFormat(d) { - var date = new Date(d); - var twoDigits = function twoDigits(n) { - return n < 10 ? "0" + n : n; - }; - return Math.floor(d / 36e5) + ":" + twoDigits(date.getMinutes()) + ":" + twoDigits(date.getSeconds()); + return (0, _output.markdown)(tasks, expanded); } }, { key: 'getConfig', @@ -279,7 +211,6 @@ var Manager = function () { }, { key: 'configure', value: function configure(element, value) { - if (_constants.configElements.indexOf(element) < 0) { return (0, _output.cliError)('Config key (' + element + ') not allowed, allowed keys: ' + this.configElements.toString() + ' '); } @@ -294,7 +225,7 @@ var Manager = function () { }, { key: 'update', value: function update() { - var _this9 = this; + var _this8 = this; if (!this.config || this.config && this.config['config.version'] !== '2') { console.log('DB: Need to be updated'); @@ -306,8 +237,8 @@ var Manager = function () { }); return newTasks; }).then(function (migratedTasks) { - _this9.cfg.set('tasks', migratedTasks); - _this9.cfg.set('config', Object.assign(_this9.config, { + _this8.cfg.set('tasks', migratedTasks); + _this8.cfg.set('config', Object.assign(_this8.config, { 'config.version': '2' })); diff --git a/lib/core/Manager.js.map b/lib/core/Manager.js.map index 568df2b..0c463f8 100644 --- a/lib/core/Manager.js.map +++ b/lib/core/Manager.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/Manager.js"],"names":["Manager","cfg","repositories","tasks","all","config","key","task","update","get","Object","assign","set","description","t","getTask","start","then","storeTask","console","log","toISOString","catch","pause","unpause","stop","text","setDescription","name","getSeconds","operation","stringTime","makeOperationOverTime","string","keys","forEach","indexOf","push","search","map","k","join","length","prompt","type","message","default","answers","cls","unflatten","end","timings","unflatTasks","body","total","filterDates","Date","dateFormat","hourFormat","filterStart","filtered","i","filterEnd","unflattened","i1","i2","timing","d","date","getFullYear","twoDigits","n","getMonth","getDate","getHours","getMinutes","Math","floor","element","value","configElements","toString","newCfg","newTasks","migratedTasks","rate","full","sort","a","b"],"mappings":"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","file":"Manager.js","sourcesContent":["import flat from 'flat'\nimport moment from 'moment'\nimport inquirer from 'inquirer'\n\nimport Task from './Task'\nimport { recognizeModifierTiming } from './utils'\nimport { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED, configElements } from './constants'\nimport { sumarize, outputVertical, cliError, cliSuccess } from './output'\nimport { migrateToV2 } from './dbMigrations'\n\nexport default class Manager {\n\n repositories = ['tasks', 'config']\n\n constructor(cfg) {\n this.cfg = cfg\n this.tasks = cfg.all.tasks\n this.config = (cfg.all.config) ? cfg.all.config : {}\n }\n\n getTask(key) {\n let task = (this.tasks[key]) ? this.tasks[key] : null\n return new Task(task)\n }\n\n storeTask(key, task){\n let update = {}\n update[key] = task.get()\n this.tasks = Object.assign({}, this.tasks, update)\n this.cfg.set('tasks', this.tasks)\n }\n\n startTask(key, description) {\n let t = this.getTask(key)\n t.start(description)\n .then(() => {\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, STARTED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n pauseTask(key){\n let t = this.getTask(key)\n t.pause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, PAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n unpauseTask(key){\n let t = this.getTask(key)\n t.unpause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, UNPAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n stopTask(key, description) {\n let t = this.getTask(key)\n t.stop(description)\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, FINISHED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n addDescription(key, text){\n let t = this.getTask(key)\n t.setDescription(text)\n this.storeTask(key, t)\n }\n\n getTime(name) {\n let t = this.getTask(name)\n return t.getSeconds()\n }\n\n modifyTask(operation, name, stringTime){\n let t = this.getTask(name)\n t.makeOperationOverTime(operation, stringTime)\n .then(()=>{\n this.storeTask(name, t)\n }, cliError)\n .catch(cliError)\n }\n\n search(string) {\n let keys = Object.keys(this.tasks)\n let tasks = []\n keys.forEach((key)=>{\n if (string === 'all' || key.indexOf(string) > -1){\n tasks.push({\n name: key,\n task: new Task(this.tasks[key])\n })\n }\n })\n return tasks\n }\n\n delete(string) {\n let tasks = this.search(string)\n\n console.log(\n tasks.map(k => `${k.name} \\n`).join('')\n )\n\n if (tasks.length === 0) {\n cliSuccess('No tasks found to delete.')\n return\n }\n\n inquirer.prompt([{\n type: 'confirm',\n name: 'cls',\n message: `Are you sure you want to delete this tasks?`,\n default: false\n }]).then((answers) => {\n if (answers.cls){\n tasks.forEach(k => {\n delete this.tasks[k.name]\n this.cfg.set('tasks', this.tasks)\n })\n cliSuccess('Tasks deleted.')\n }\n })\n .catch(cliError)\n }\n\n getTasksJson(key) {\n return flat.unflatten(key ? this.tasks[key]: this.tasks)\n }\n\n\tgetTasksMd(key, start, end) {\n\t\tlet timings\n\t\tif(key){\n\t\t\ttimings = this.tasks[key].timings\n\t\t}else{\n\t\t\ttimings = this.unflatTasks(this.tasks)\n\t\t}\n\t\tlet body = \t\"| Start | End | Hours | Subtotal | Description |\\n\"\n\t\tbody += \t\"| ----- | --- | -----:| -------: | ----------- |\\n\"\n\t\tlet total = 0;\n\n\t\ttimings = start || end ? this.filterDates(timings, start, end) : timings\n\t\ttimings.forEach( k => {\n\t\t\tlet start = new Date(k.start)\n\t\t\tlet stop = k.stop ? new Date(k.stop) : new Date()\n\t\t\ttotal += stop - start\n\t\t\tbody += \"|\" + this.dateFormat(start)+ \"|\" + this.dateFormat(stop)+ \"|\"+ this.hourFormat(stop - start)+ \"|\"+ this.hourFormat(total)+ \"|\" + k.name+ \"|\\n\"\n\t\t})\n\t\tbody += \t\"| | | |\\n\"\n\t\tbody += \t\"| Total | | \" + this.hourFormat(total)+ \" | | |\\n\"\n\n return body\n }\n\n\tfilterDates(timings, start, end){\n\t\tlet filterStart = function(timings){\n\t\t\tlet filtered = []\n\t\t\tfor(let i = 0; i < timings.length; i++){\n\t\t\t\tif(new Date(start) < new Date(timings[i].start)){\n\t\t\t\t\tfiltered.push(timings[i])\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn filtered\n\t\t}\n\t\tlet filterEnd = function(timings){\n\t\t\tlet filtered = []\n\t\t\tfor(let i = 0; i < timings.length; i++){\n\t\t\t\tif(new Date(end) > new Date(timings[i].start)){\n\t\t\t\t\tfiltered.push(timings[i])\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn filtered\n\t\t}\n\n\t\treturn start && end ? filterStart(filterEnd(timings)) : (start ? filterStart(timings) : filterEnd(timings))\n\t}\n\tunflatTasks(tasks){\n\t\tlet keys = Object.keys(tasks)\n\t\tlet unflattened = []\n\t\tfor(let i1 = 0; i1 < keys.length; i1++){\n\t\t\tfor(let i2 = 0; i2 < tasks[keys[i1]].timings.length; i2++){\n\t\t\t\tlet timing = tasks[keys[i1]].timings[i2]\n\t\t\t\ttiming.name = keys[i1]\n\t\t\t\ttiming.description = tasks[keys[i1]].description\n\t\t\t\tunflattened.push(timing)\n\t\t\t}\n\t\t}\n\t\treturn unflattened\n\t}\n\n\tdateFormat(d){\n\t\tlet date = d.getFullYear() + \"/\"\n\t\tlet twoDigits = n => n < 10 ? \"0\" + n : n\n\t\tdate += twoDigits(d.getMonth()+1) + \"/\"\n\t\tdate += twoDigits(d.getDate()) + \" \"\n\t\tdate += twoDigits(d.getHours()) + \":\"\n\t\tdate += twoDigits(d.getMinutes()) + \":\"\n\t\tdate += twoDigits(d.getSeconds())\n\t\treturn date\n\t}\n\n\thourFormat(d){\n\t\tlet date = new Date(d)\n\t\tlet twoDigits = n => n < 10 ? \"0\" + n : n\n\t\treturn Math.floor(d / 36e5) + \":\" + twoDigits(date.getMinutes()) + \":\" + twoDigits(date.getSeconds())\n\t}\n\n getConfig(){\n return this.config\n }\n\n configure(element, value){\n\n if (configElements.indexOf(element) < 0){\n return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `)\n }\n\n let newCfg = {\n [element]: value\n }\n\n this.config = Object.assign({}, this.config, newCfg)\n this.cfg.set('config', this.config)\n\n return this.config\n }\n\n update() {\n if (!this.config || (this.config && this.config['config.version'] !== '2') ){\n console.log('DB: Need to be updated')\n\n migrateToV2(this.tasks)\n .then(tasks => {\n let newTasks = {}\n tasks.forEach(t => newTasks[t.key] = t.task)\n return newTasks\n })\n .then(migratedTasks => {\n this.cfg.set('tasks', migratedTasks)\n this.cfg.set('config', Object.assign(this.config, {\n 'config.version': '2'\n }))\n\n cliSuccess('Configuration migrated to version 2.')\n }, cliError)\n .catch(cliError)\n } else {\n cliSuccess('No need to update the DB.')\n }\n }\n\n sumarize(key, rate, full=true){\n let tasks = this.search(key)\n tasks.sort((a,b) => { return a.name > b.name })\n sumarize(key, tasks, rate, full, this.config['format.output'])\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/Manager.js"],"names":["Manager","cfg","repositories","tasks","all","config","key","task","update","get","Object","assign","set","description","t","getTask","start","then","storeTask","console","log","toISOString","catch","pause","unpause","stop","text","setDescription","name","getSeconds","operation","stringTime","makeOperationOverTime","string","keys","forEach","indexOf","push","search","map","k","join","length","prompt","type","message","default","answers","cls","unflatten","end","expanded","filterByDates","element","value","configElements","toString","newCfg","newTasks","migratedTasks","rate","full","sort","a","b"],"mappings":"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","file":"Manager.js","sourcesContent":["import flat from 'flat';\nimport moment from 'moment';\nimport inquirer from 'inquirer';\n\nimport Task from './Task';\nimport { recognizeModifierTiming, humanParseDiff, getSeconds } from './utils';\nimport {\n STARTED,\n PAUSED,\n UNPAUSED,\n IN_PROGRESS,\n FINISHED,\n configElements\n} from './constants';\nimport { sumarize, outputVertical, cliError, cliSuccess, markdown } from './output';\nimport { migrateToV2 } from './dbMigrations';\n\nexport default class Manager {\n repositories = ['tasks', 'config'];\n\n constructor(cfg) {\n this.cfg = cfg;\n this.tasks = cfg.all.tasks;\n this.config = cfg.all.config ? cfg.all.config : {};\n }\n\n getTask(key) {\n let task = this.tasks[key] ? this.tasks[key] : null;\n return new Task(task);\n }\n\n storeTask(key, task) {\n let update = {};\n update[key] = task.get();\n this.tasks = Object.assign({}, this.tasks, update);\n this.cfg.set('tasks', this.tasks);\n }\n\n startTask(key, description) {\n let t = this.getTask(key);\n t\n .start(description)\n .then(() => {\n this.storeTask(key, t);\n console.log(\n outputVertical('Task:', key, STARTED, moment().toISOString())\n );\n }, cliError)\n .catch(cliError);\n }\n\n pauseTask(key) {\n let t = this.getTask(key);\n t\n .pause()\n .then(() => {\n this.storeTask(key, t);\n console.log(outputVertical('Task:', key, PAUSED, moment().toISOString()));\n }, cliError)\n .catch(cliError);\n }\n\n unpauseTask(key) {\n let t = this.getTask(key);\n t\n .unpause()\n .then(() => {\n this.storeTask(key, t);\n console.log(\n outputVertical('Task:', key, UNPAUSED, moment().toISOString())\n );\n }, cliError)\n .catch(cliError);\n }\n\n stopTask(key, description) {\n let t = this.getTask(key);\n t\n .stop(description)\n .then(() => {\n this.storeTask(key, t);\n console.log(\n outputVertical('Task:', key, FINISHED, moment().toISOString())\n );\n }, cliError)\n .catch(cliError);\n }\n\n addDescription(key, text) {\n let t = this.getTask(key);\n t.setDescription(text);\n this.storeTask(key, t);\n }\n\n getTime(name) {\n let t = this.getTask(name);\n return t.getSeconds();\n }\n\n modifyTask(operation, name, stringTime) {\n let t = this.getTask(name);\n t\n .makeOperationOverTime(operation, stringTime)\n .then(() => {\n this.storeTask(name, t);\n }, cliError)\n .catch(cliError);\n }\n\n search(string = 'all') {\n let keys = Object.keys(this.tasks);\n let tasks = [];\n keys.forEach(key => {\n if (string === 'all' || key.indexOf(string) > -1) {\n tasks.push({\n name: key,\n task: new Task(this.tasks[key])\n });\n }\n });\n return tasks;\n }\n\n delete(string) {\n let tasks = this.search(string);\n\n console.log(tasks.map(k => `${k.name} \\n`).join(''));\n\n if (tasks.length === 0) {\n cliSuccess('No tasks found to delete.');\n return;\n }\n\n inquirer\n .prompt([\n {\n type: 'confirm',\n name: 'cls',\n message: `Are you sure you want to delete this tasks?`,\n default: false\n }\n ])\n .then(answers => {\n if (answers.cls) {\n tasks.forEach(k => {\n delete this.tasks[k.name];\n this.cfg.set('tasks', this.tasks);\n });\n cliSuccess('Tasks deleted.');\n }\n })\n .catch(cliError);\n }\n\n getTasksJson(key) {\n return flat.unflatten(key ? this.tasks[key] : this.tasks);\n }\n\n getTasksMd(key, start, end, expanded) {\n let tasks;\n if (key) {\n tasks = this.search(key);\n } else {\n tasks = this.search();\n }\n\n tasks.map(task => {\n if (start || end) {\n task = task.task.filterByDates(start, end);\n }\n return task;\n });\n\n return markdown(tasks, expanded);\n }\n\n getConfig() {\n return this.config;\n }\n\n configure(element, value) {\n if (configElements.indexOf(element) < 0) {\n return cliError(\n `Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `\n );\n }\n\n let newCfg = {\n [element]: value\n };\n\n this.config = Object.assign({}, this.config, newCfg);\n this.cfg.set('config', this.config);\n\n return this.config;\n }\n\n update() {\n if (!this.config || (this.config && this.config['config.version'] !== '2')) {\n console.log('DB: Need to be updated');\n\n migrateToV2(this.tasks)\n .then(tasks => {\n let newTasks = {};\n tasks.forEach(t => (newTasks[t.key] = t.task));\n return newTasks;\n })\n .then(migratedTasks => {\n this.cfg.set('tasks', migratedTasks);\n this.cfg.set(\n 'config',\n Object.assign(this.config, {\n 'config.version': '2'\n })\n );\n\n cliSuccess('Configuration migrated to version 2.');\n }, cliError)\n .catch(cliError);\n } else {\n cliSuccess('No need to update the DB.');\n }\n }\n\n sumarize(key, rate, full = true) {\n let tasks = this.search(key);\n tasks.sort((a, b) => {\n return a.name > b.name;\n });\n sumarize(key, tasks, rate, full, this.config['format.output']);\n }\n}\n"]} \ No newline at end of file diff --git a/lib/core/Task.js b/lib/core/Task.js index 65f178b..009d525 100644 --- a/lib/core/Task.js +++ b/lib/core/Task.js @@ -17,6 +17,8 @@ var _utils = require('./utils'); var _output = require('./output'); +var _constants2 = require('constants'); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -29,18 +31,10 @@ var Task = function () { description: '', timings: [] }; + this.filtered = false; } _createClass(Task, [{ - key: '_calcTime', - value: function _calcTime(t) { - if (t.stop) { - return (0, _moment2.default)(t.stop).diff((0, _moment2.default)(t.start), 'seconds'); - } else { - return (0, _moment2.default)().diff((0, _moment2.default)(t.start), 'seconds'); - } - } - }, { key: '_modifyTiming', value: function _modifyTiming(time, operation) { var timing = this.task.timings[this.task.timings.length - 1]; @@ -199,19 +193,62 @@ var Task = function () { value: function get() { return this.task; } + }, { + key: 'filterByDates', + value: function filterByDates(start, end) { + if (this.task.timings) { + if (start && end) { + this.task.timings = this._filterTimingsByDate(start, end); + } else if (start) { + end = (0, _moment2.default)().format('YYYY/MM/DD'); + this.task.timings = this._filterTimingsByDate(start, end); + } else if (end) { + start = (0, _moment2.default)(0).format('YYYY/MM/DD'); + this.task.timings = this._filterTimingsByDate(start, end); + } + + if (this.task.timings.length === 0) { + this.filtered = true; + } + } else { + var t = (0, _utils.inPeriod)(this.task.start, this.task.stop, start, end); + if (t.isBetween) { + this.task.start = t.start; + this.task.stop = t.stop; + } else { + this.filtered = true; + } + } + + return this; + } + }, { + key: '_filterTimingsByDate', + value: function _filterTimingsByDate(start, end) { + return this.task.timings.reduce(function (acc, val) { + console.log(val); + var t = (0, _utils.inPeriod)(val.start, val.stop, start, end); + console.log(t); + if (t.isBetween) { + acc.push({ + start: t.start, + stop: t.stop + }); + } + return acc; + }, []); + } }, { key: 'getSeconds', value: function getSeconds() { - var _this6 = this; - var duration = 0; if (this.task.timings) { this.task.timings.forEach(function (timing) { - duration += _this6._calcTime(timing); + duration += (0, _utils.getSeconds)(timing); }); } else { - duration = this._calcTime(this.task); + duration = (0, _utils.getSeconds)(this.task); } return duration; @@ -225,6 +262,17 @@ var Task = function () { return this.task.start; } } + }, { + key: 'getEndDate', + value: function getEndDate() { + if (this.task.timings) { + return this.task.timings[this.task.timings.length - 1].stop; + } else if (this.task.stop) { + return this.task.stop; + } else { + return (0, _moment2.default)().toDate(); + } + } }, { key: 'error', value: function error(err) { diff --git a/lib/core/Task.js.map b/lib/core/Task.js.map index d6350fc..c2da4aa 100644 --- a/lib/core/Task.js.map +++ b/lib/core/Task.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/Task.js"],"names":["Task","task","description","timings","t","stop","diff","start","time","operation","timing","length","newStop","value","momentKey","isBefore","Promise","resolve","reject","started","error","push","toDate","setDescription","setStatus","log","toISOString","text","status","stringTime","parsed","map","_modifyTiming","err","console","duration","forEach","_calcTime"],"mappings":"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","file":"Task.js","sourcesContent":["import moment from 'moment'\n\nimport { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants'\nimport { recognizeModifierTiming } from './utils'\nimport { cliError } from './output'\n\n\nexport default class Task {\n constructor(task){\n this.task = (task) ? task : {\n description: '',\n timings: []\n }\n }\n\n _calcTime(t){\n if (t.stop) {\n return moment(t.stop).diff(moment(t.start), 'seconds')\n } else {\n return moment().diff(moment(t.start), 'seconds')\n }\n }\n\n _modifyTiming(time, operation){\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n throw (`This task is not started, start it.`)\n }\n\n let newStop = moment(timing.stop)\n newStop = newStop[operation](time.value, time.momentKey)\n\n if (operation === 'subtract' && newStop.isBefore(timing.start)){\n throw('You cant subtract more time')\n return\n }\n\n this.task.timings[this.task.timings.length - 1].stop = newStop\n }\n\n start(description){\n return new Promise((resolve, reject)=>{\n let started = false\n\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task already started.`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n\n this.setDescription(description)\n this.setStatus(IN_PROGRESS)\n this.log('start')\n resolve()\n })\n }\n\n pause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (!timing){\n reject(this.error(`This task is not started, start it.`))\n }\n\n if (timing && timing.start && timing.stop) {\n reject(this.error(`This task are ended/paused, unpaused it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setStatus(PAUSED)\n this.log('pause')\n resolve()\n })\n }\n\n unpause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task is started, pause/stop first`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n this.setStatus(IN_PROGRESS)\n this.log('unpause')\n resolve()\n })\n }\n\n stop (description){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing || timing && !timing.start){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing.start && timing.stop) {\n reject(this.error(`This task already ended, start/unpause it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setDescription(description)\n this.setStatus(FINISHED)\n this.log('stop')\n resolve()\n })\n }\n\n log(operation){\n if (!this.task.log){\n this.task.log = []\n }\n\n this.task.log.push(`${operation}#${moment().toISOString()}`)\n }\n\n description(){\n return this.task.description\n }\n\n setDescription(text){\n this.task.description = (text) ? text : (this.task.description) ? this.task.description : ''\n }\n\n setStatus(status){\n this.task.status = status\n }\n\n makeOperationOverTime(operation, stringTime) {\n return new Promise((resolve, reject) => {\n let parsed = recognizeModifierTiming(stringTime)\n\n try {\n parsed.map((t)=>{\n this._modifyTiming(t, operation)\n })\n } catch(err){\n console.error(err)\n reject(this.error(`Error trying to ${operation} time to task`))\n }\n this.log(`${operation}:${stringTime}`)\n\n resolve()\n })\n }\n\n get(){\n return this.task\n }\n\n getSeconds(){\n let duration = 0\n\n if (this.task.timings){\n this.task.timings.forEach(timing => {\n duration += this._calcTime(timing)\n })\n } else {\n duration = this._calcTime(this.task)\n }\n\n return duration\n }\n\n getStartDate(){\n if (this.task.timings && this.task.timings[0]){\n return this.task.timings[0].start\n } else {\n return this.task.start\n }\n }\n\n error(err){\n return err //+ ` \\n Task: ${JSON.stringify(this.task)}`\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/Task.js"],"names":["Task","task","description","timings","filtered","time","operation","timing","length","newStop","stop","value","momentKey","isBefore","start","Promise","resolve","reject","started","error","push","toDate","setDescription","setStatus","log","toISOString","text","status","stringTime","parsed","map","_modifyTiming","t","err","console","end","_filterTimingsByDate","format","isBetween","reduce","acc","val","duration","forEach"],"mappings":"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","file":"Task.js","sourcesContent":["import moment from 'moment';\n\nimport { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants';\nimport { recognizeModifierTiming, inPeriod, getSeconds } from './utils';\nimport { cliError } from './output';\nimport { EINPROGRESS } from 'constants';\n\nexport default class Task {\n constructor(task) {\n this.task = task\n ? task\n : {\n description: '',\n timings: []\n };\n this.filtered = false;\n }\n\n _modifyTiming(time, operation) {\n let timing = this.task.timings[this.task.timings.length - 1];\n if (!timing) {\n throw `This task is not started, start it.`;\n }\n\n let newStop = moment(timing.stop);\n newStop = newStop[operation](time.value, time.momentKey);\n\n if (operation === 'subtract' && newStop.isBefore(timing.start)) {\n throw 'You cant subtract more time';\n return;\n }\n\n this.task.timings[this.task.timings.length - 1].stop = newStop;\n }\n\n start(description) {\n return new Promise((resolve, reject) => {\n let started = false;\n\n let timing = this.task.timings[this.task.timings.length - 1];\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task already started.`));\n }\n\n this.task.timings.push({\n start: moment().toDate()\n });\n\n this.setDescription(description);\n this.setStatus(IN_PROGRESS);\n this.log('start');\n resolve();\n });\n }\n\n pause() {\n return new Promise((resolve, reject) => {\n let timing = this.task.timings[this.task.timings.length - 1];\n\n if (!timing) {\n reject(this.error(`This task is not started, start it.`));\n }\n\n if (timing && timing.start && timing.stop) {\n reject(this.error(`This task are ended/paused, unpaused it.`));\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate();\n this.setStatus(PAUSED);\n this.log('pause');\n resolve();\n });\n }\n\n unpause() {\n return new Promise((resolve, reject) => {\n let timing = this.task.timings[this.task.timings.length - 1];\n if (!timing) {\n reject(this.error(`This task is not started, start it`));\n }\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task is started, pause/stop first`));\n }\n\n this.task.timings.push({\n start: moment().toDate()\n });\n this.setStatus(IN_PROGRESS);\n this.log('unpause');\n resolve();\n });\n }\n\n stop(description) {\n return new Promise((resolve, reject) => {\n let timing = this.task.timings[this.task.timings.length - 1];\n if (!timing || (timing && !timing.start)) {\n reject(this.error(`This task is not started, start it`));\n }\n\n if (timing.start && timing.stop) {\n reject(this.error(`This task already ended, start/unpause it.`));\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate();\n this.setDescription(description);\n this.setStatus(FINISHED);\n this.log('stop');\n resolve();\n });\n }\n\n log(operation) {\n if (!this.task.log) {\n this.task.log = [];\n }\n\n this.task.log.push(`${operation}#${moment().toISOString()}`);\n }\n\n description() {\n return this.task.description;\n }\n\n setDescription(text) {\n this.task.description = text\n ? text\n : this.task.description ? this.task.description : '';\n }\n\n setStatus(status) {\n this.task.status = status;\n }\n\n makeOperationOverTime(operation, stringTime) {\n return new Promise((resolve, reject) => {\n let parsed = recognizeModifierTiming(stringTime);\n\n try {\n parsed.map(t => {\n this._modifyTiming(t, operation);\n });\n } catch (err) {\n console.error(err);\n reject(this.error(`Error trying to ${operation} time to task`));\n }\n this.log(`${operation}:${stringTime}`);\n\n resolve();\n });\n }\n\n get() {\n return this.task;\n }\n\n filterByDates(start, end) {\n if (this.task.timings) {\n if (start && end) {\n this.task.timings = this._filterTimingsByDate(start, end);\n } else if (start) {\n end = moment().format('YYYY/MM/DD');\n this.task.timings = this._filterTimingsByDate(start, end);\n } else if (end) {\n start = moment(0).format('YYYY/MM/DD');\n this.task.timings = this._filterTimingsByDate(start, end);\n }\n\n if (this.task.timings.length === 0) {\n this.filtered = true;\n }\n } else {\n let t = inPeriod(this.task.start, this.task.stop, start, end);\n if (t.isBetween) {\n this.task.start = t.start;\n this.task.stop = t.stop;\n } else {\n this.filtered = true;\n }\n }\n\n return this;\n }\n\n _filterTimingsByDate(start, end) {\n return this.task.timings.reduce((acc, val) => {\n console.log(val);\n let t = inPeriod(val.start, val.stop, start, end);\n console.log(t);\n if (t.isBetween) {\n acc.push({\n start: t.start,\n stop: t.stop\n });\n }\n return acc;\n }, []);\n }\n\n getSeconds() {\n let duration = 0;\n\n if (this.task.timings) {\n this.task.timings.forEach(timing => {\n duration += getSeconds(timing);\n });\n } else {\n duration = getSeconds(this.task);\n }\n\n return duration;\n }\n\n getStartDate() {\n if (this.task.timings && this.task.timings[0]) {\n return this.task.timings[0].start;\n } else {\n return this.task.start;\n }\n }\n\n getEndDate() {\n if (this.task.timings) {\n return this.task.timings[this.task.timings.length - 1].stop;\n } else if (this.task.stop) {\n return this.task.stop;\n } else {\n return moment().toDate();\n }\n }\n\n error(err) {\n return err; //+ ` \\n Task: ${JSON.stringify(this.task)}`\n }\n}\n"]} \ No newline at end of file diff --git a/lib/core/output.js b/lib/core/output.js index 81e0ee7..77dcd8b 100644 --- a/lib/core/output.js +++ b/lib/core/output.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.cliSuccess = exports.cliError = exports.outputVertical = exports.outputConfig = exports.sumarize = undefined; +exports.markdown = exports.cliSuccess = exports.cliError = exports.outputVertical = exports.outputConfig = exports.sumarize = undefined; var _moment = require('moment'); @@ -28,17 +28,17 @@ var sumarize = exports.sumarize = function sumarize(search, tasks, rate, full, f head: ['Name', 'Description', 'Dates', 'Duration'], colAligns: ['left', 'center', 'center', 'left'], chars: { - 'top': '═', + top: '═', 'top-mid': '╤', 'top-left': '╔', 'top-right': '╗', - 'bottom': '═', + bottom: '═', 'bottom-mid': '╧', 'bottom-left': '╚', 'bottom-right': '╝', - 'left': '║', + left: '║', 'left-mid': '╟', - 'right': '║', + right: '║', 'right-mid': '╢' }, style: { head: ['green'] } @@ -78,9 +78,17 @@ var sumarize = exports.sumarize = function sumarize(search, tasks, rate, full, f table.push([]); if (rate) { - table.push([{ rowSpan: 2, content: _colors2.default.red('Search:') + ' "' + search + '"', vAlign: 'center' }, _colors2.default.red('Total time'), (0, _utils.humanParseDiff)(total)], [_colors2.default.red('Rate'), (0, _utils.calcRate)(rate, total)]); + table.push([{ + rowSpan: 2, + content: _colors2.default.red('Search:') + ' "' + search + '"', + vAlign: 'center' + }, _colors2.default.red('Total time'), (0, _utils.humanParseDiff)(total)], [_colors2.default.red('Rate'), (0, _utils.calcRate)(rate, total)]); } else { - table.push([{ rowSpan: 2, content: _colors2.default.red('Search:') + ' "' + search + '"', vAlign: 'center' }, { rowSpan: 2, content: '', vAlign: 'center' }, { rowSpan: 2, content: _colors2.default.red('Total time'), vAlign: 'center' }, { rowSpan: 2, content: (0, _utils.humanParseDiff)(total), vAlign: 'center' }], []); + table.push([{ + rowSpan: 2, + content: _colors2.default.red('Search:') + ' "' + search + '"', + vAlign: 'center' + }, { rowSpan: 2, content: '', vAlign: 'center' }, { rowSpan: 2, content: _colors2.default.red('Total time'), vAlign: 'center' }, { rowSpan: 2, content: (0, _utils.humanParseDiff)(total), vAlign: 'center' }], []); } } @@ -91,17 +99,17 @@ var outputConfig = exports.outputConfig = function outputConfig(config) { var table = new _cliTable2.default({ head: ['Key', 'value'], chars: { - 'top': '═', + top: '═', 'top-mid': '╤', 'top-left': '╔', 'top-right': '╗', - 'bottom': '═', + bottom: '═', 'bottom-mid': '╧', 'bottom-left': '╚', 'bottom-right': '╝', - 'left': '║', + left: '║', 'left-mid': '╟', - 'right': '║', + right: '║', 'right-mid': '╢' }, colAligns: ['center', 'center'], @@ -134,4 +142,44 @@ var cliError = exports.cliError = function cliError(err) { var cliSuccess = exports.cliSuccess = function cliSuccess(err) { console.log(_colors2.default.green(err)); }; + +var markdown = exports.markdown = function markdown(tasks) { + var expanded = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + var body = '| Start | End | Hours | Subtotal | Description |\n'; + body += '| ----- | --- | -----:| -------: | ----------- |\n'; + var total = 0; + + //tasks = start || end ? this.filterDates(tasks, start, end) : tasks; + tasks.forEach(function (task) { + var name = task.name; + task = task.task; + + if (!task.filtered) { + var duration = task.getSeconds(); + total += duration; + + if (expanded && task.task.timings.length > 1) { + var subtotal = 0; + var times = 0; + + task.task.timings.forEach(function (timing) { + var secs = (0, _utils.getSeconds)(timing); + subtotal += secs; + times += 1; + body += '|' + (0, _moment2.default)(timing.start).format('YYYY/MM/DD kk:mm') + ('|' + (0, _moment2.default)(timing.stop).format('YYYY/MM/DD kk:mm')) + ('|' + (0, _utils.humanParseDiff)(secs)) + ('|' + (0, _utils.humanParseDiff)(subtotal)) + ('|' + name + ' (part ' + times + ')') + '|\n'; + }); + } else { + var start = task.getStartDate(); + var stop = task.getEndDate(); + + body += '|' + (0, _moment2.default)(start).format('YYYY/MM/DD kk:mm') + ('|' + (0, _moment2.default)(stop).format('YYYY/MM/DD kk:mm')) + ('|' + (0, _utils.humanParseDiff)(duration)) + ('|' + (0, _utils.humanParseDiff)(total)) + ('|' + name) + '|\n'; + } + } + }); + body += '| | | |\n'; + body += '| Total | | ' + (0, _utils.humanParseDiff)(total) + ' | | |\n'; + + return body; +}; //# sourceMappingURL=output.js.map \ No newline at end of file diff --git a/lib/core/output.js.map b/lib/core/output.js.map index 03ce1d5..aa0e112 100644 --- a/lib/core/output.js.map +++ b/lib/core/output.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/output.js"],"names":["sumarize","search","tasks","rate","full","format","table","head","colAligns","chars","style","total","forEach","task","index","description","name","duration","getSeconds","splitWidth","str","len","arr","length","push","substring","join","getStartDate","rowSpan","content","red","vAlign","console","log","toString","outputConfig","config","Object","keys","map","e","outputVertical","args","table2","key","splice","cliError","err","error","cliSuccess","green"],"mappings":"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","file":"output.js","sourcesContent":["import moment from 'moment'\nimport Table from 'cli-table2'\nimport colors from 'colors'\n\nimport { humanParseDiff, calcRate } from './utils'\n\nexport const sumarize = function(search, tasks, rate, full, format) {\n let table = new Table({\n head: ['Name','Description', 'Dates', 'Duration'],\n colAligns: ['left', 'center', 'center', 'left'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n style: { head: ['green'] }\n });\n let total = 0\n let head= `Search: ${search} \\n`\n\n tasks.forEach((task, index) => {\n\t\tlet description = (task.task.description() && task.task.description() !== '')\n\t\t? task.task.description()\n\t\t: '-'\n let name = task.name\n task = task.task\n\n let duration = task.getSeconds()\n total += duration\n\n // Avoid excesive width for proper console fit\n let splitWidth = (str, len) => {\n let arr = []\n while (str != '') {\n if (str.length > len) {\n arr.push(str.substring(0,len))\n str = str.substring(len);\n } else {\n arr.push(str)\n break\n }\n }\n return arr.join('\\n')\n }\n description = splitWidth(description, 51)\n name = splitWidth(name, 40)\n\n table.push([name, description, moment(task.getStartDate()).format(format), humanParseDiff(duration)])\n })\n\n if (full){\n table.push([])\n\n if (rate){\n table.push(\n [{ rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center'}, colors.red('Total time'), humanParseDiff(total)],\n [ colors.red('Rate'), calcRate(rate, total)]\n )\n } else {\n table.push(\n [\n { rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center' },\n { rowSpan:2, content: '', vAlign:'center' },\n { rowSpan:2, content: colors.red('Total time'), vAlign:'center' },\n { rowSpan:2, content: humanParseDiff(total), vAlign:'center' }\n ],\n []\n )\n }\n }\n\n console.log(table.toString());\n}\n\nexport const outputConfig = function (config){\n let table = new Table({\n head: ['Key', 'value'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n colAligns: ['center', 'center'],\n style: { head: ['green'] }\n });\n\n Object.keys(config).map(e => table.push([e, config[e]]))\n\n console.log(table.toString());\n}\n\nexport const outputVertical = function (...args){\n let table2 = new Table()\n let key = args.splice(0, 1)\n table2.push(\n { [key]: args },\n )\n\n return table2.toString()\n}\n\nexport const cliError = function(err) {\n console.error(colors.red(`Error: ${err}`))\n}\n\nexport const cliSuccess = function(err) {\n console.log(colors.green(err))\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/output.js"],"names":["sumarize","search","tasks","rate","full","format","table","head","colAligns","chars","top","bottom","left","right","style","total","forEach","task","index","description","name","duration","getSeconds","splitWidth","str","len","arr","length","push","substring","join","getStartDate","rowSpan","content","red","vAlign","console","log","toString","outputConfig","config","Object","keys","map","e","outputVertical","args","table2","key","splice","cliError","err","error","cliSuccess","green","markdown","expanded","body","filtered","timings","subtotal","times","secs","timing","start","stop","getEndDate"],"mappings":"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","file":"output.js","sourcesContent":["import moment from 'moment';\nimport Table from 'cli-table2';\nimport colors from 'colors';\n\nimport { humanParseDiff, calcRate, getSeconds } from './utils';\n\nexport const sumarize = function(search, tasks, rate, full, format) {\n let table = new Table({\n head: ['Name', 'Description', 'Dates', 'Duration'],\n colAligns: ['left', 'center', 'center', 'left'],\n chars: {\n top: '═',\n 'top-mid': '╤',\n 'top-left': '╔',\n 'top-right': '╗',\n bottom: '═',\n 'bottom-mid': '╧',\n 'bottom-left': '╚',\n 'bottom-right': '╝',\n left: '║',\n 'left-mid': '╟',\n right: '║',\n 'right-mid': '╢'\n },\n style: { head: ['green'] }\n });\n let total = 0;\n let head = `Search: ${search} \\n`;\n\n tasks.forEach((task, index) => {\n let description =\n task.task.description() && task.task.description() !== ''\n ? task.task.description()\n : '-';\n let name = task.name;\n task = task.task;\n\n let duration = task.getSeconds();\n total += duration;\n\n // Avoid excesive width for proper console fit\n let splitWidth = (str, len) => {\n let arr = [];\n while (str != '') {\n if (str.length > len) {\n arr.push(str.substring(0, len));\n str = str.substring(len);\n } else {\n arr.push(str);\n break;\n }\n }\n return arr.join('\\n');\n };\n description = splitWidth(description, 51);\n name = splitWidth(name, 40);\n\n table.push([\n name,\n description,\n moment(task.getStartDate()).format(format),\n humanParseDiff(duration)\n ]);\n });\n\n if (full) {\n table.push([]);\n\n if (rate) {\n table.push(\n [\n {\n rowSpan: 2,\n content: `${colors.red('Search:')} \"${search}\"`,\n vAlign: 'center'\n },\n colors.red('Total time'),\n humanParseDiff(total)\n ],\n [colors.red('Rate'), calcRate(rate, total)]\n );\n } else {\n table.push(\n [\n {\n rowSpan: 2,\n content: `${colors.red('Search:')} \"${search}\"`,\n vAlign: 'center'\n },\n { rowSpan: 2, content: '', vAlign: 'center' },\n { rowSpan: 2, content: colors.red('Total time'), vAlign: 'center' },\n { rowSpan: 2, content: humanParseDiff(total), vAlign: 'center' }\n ],\n []\n );\n }\n }\n\n console.log(table.toString());\n};\n\nexport const outputConfig = function(config) {\n let table = new Table({\n head: ['Key', 'value'],\n chars: {\n top: '═',\n 'top-mid': '╤',\n 'top-left': '╔',\n 'top-right': '╗',\n bottom: '═',\n 'bottom-mid': '╧',\n 'bottom-left': '╚',\n 'bottom-right': '╝',\n left: '║',\n 'left-mid': '╟',\n right: '║',\n 'right-mid': '╢'\n },\n colAligns: ['center', 'center'],\n style: { head: ['green'] }\n });\n\n Object.keys(config).map(e => table.push([e, config[e]]));\n\n console.log(table.toString());\n};\n\nexport const outputVertical = function(...args) {\n let table2 = new Table();\n let key = args.splice(0, 1);\n table2.push({ [key]: args });\n\n return table2.toString();\n};\n\nexport const cliError = function(err) {\n console.error(colors.red(`Error: ${err}`));\n};\n\nexport const cliSuccess = function(err) {\n console.log(colors.green(err));\n};\n\nexport const markdown = function(tasks, expanded = false) {\n let body = '| Start | End | Hours | Subtotal | Description |\\n';\n body += '| ----- | --- | -----:| -------: | ----------- |\\n';\n let total = 0;\n\n //tasks = start || end ? this.filterDates(tasks, start, end) : tasks;\n tasks.forEach(task => {\n let name = task.name;\n task = task.task;\n\n if (!task.filtered) {\n let duration = task.getSeconds();\n total += duration;\n\n if (expanded && task.task.timings.length > 1) {\n let subtotal = 0;\n let times = 0;\n\n task.task.timings.forEach(timing => {\n let secs = getSeconds(timing);\n subtotal += secs;\n times += 1;\n body +=\n `|${moment(timing.start).format('YYYY/MM/DD kk:mm')}` +\n `|${moment(timing.stop).format('YYYY/MM/DD kk:mm')}` +\n `|${humanParseDiff(secs)}` +\n `|${humanParseDiff(subtotal)}` +\n `|${name} (part ${times})` +\n `|\\n`;\n });\n } else {\n let start = task.getStartDate();\n let stop = task.getEndDate();\n\n body +=\n `|${moment(start).format('YYYY/MM/DD kk:mm')}` +\n `|${moment(stop).format('YYYY/MM/DD kk:mm')}` +\n `|${humanParseDiff(duration)}` +\n `|${humanParseDiff(total)}` +\n `|${name}` +\n `|\\n`;\n }\n }\n });\n body += '| | | |\\n';\n body += `| Total | | ${humanParseDiff(total)} | | |\\n`;\n\n return body;\n};\n"]} \ No newline at end of file diff --git a/lib/core/utils.js b/lib/core/utils.js index da2943d..1041efc 100644 --- a/lib/core/utils.js +++ b/lib/core/utils.js @@ -3,6 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true }); +exports.getSeconds = exports.inPeriod = exports.humanParseDiff = exports.calcRate = exports.recognizeModifierTiming = undefined; + +var _moment = require('moment'); + +var _moment2 = _interopRequireDefault(_moment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + var recognizeModifierTiming = exports.recognizeModifierTiming = function recognizeModifierTiming(string) { var r = /(\d{1,})([hms])/g; var arr = void 0; @@ -46,4 +54,39 @@ var humanParseDiff = exports.humanParseDiff = function humanParseDiff(secs) { seconds = seconds == 0 ? '00s' : (seconds < 10 ? '0' + seconds : seconds) + 's'; return hours + ' ' + minutes + ' ' + seconds; }; + +var inPeriod = exports.inPeriod = function inPeriod(start, stop, fstart, fstop) { + fstart = (0, _moment2.default)(fstart, 'YYYY/MM/DD'); + fstop = (0, _moment2.default)(fstop, 'YYYY/MM/DD'); + + console.log('fstart', fstart); + console.log('fstop', fstop); + + if ((0, _moment2.default)(start).isBetween(fstart, fstop, null, '[]') && (0, _moment2.default)(stop).isBetween(fstart, fstop, null, '[]')) { + console.log('start', start); + console.log('stop', stop); + return { isBetween: true, start: start, stop: stop }; + } + + if (!(0, _moment2.default)(start).isBetween(fstart, fstop, null, '[]') && (0, _moment2.default)(stop).isBetween(fstart, fstop, null, '[]')) { + return { isBetween: true, start: fstart, stop: stop }; + } + + if ((0, _moment2.default)(start).isBetween(fstart, fstop, null, '[]') && !(0, _moment2.default)(stop).isBetween(fstart, fstop, null, '[]')) { + return { isBetween: true, start: start, stop: fstop }; + } + + return { isBetween: false, start: start, stop: stop }; +}; + +var getSeconds = exports.getSeconds = function getSeconds(_ref) { + var start = _ref.start, + stop = _ref.stop; + + if (stop) { + return (0, _moment2.default)(stop).diff((0, _moment2.default)(start), 'seconds'); + } else { + return (0, _moment2.default)().diff((0, _moment2.default)(start), 'seconds'); + } +}; //# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/lib/core/utils.js.map b/lib/core/utils.js.map index 5c21888..f0fe51b 100644 --- a/lib/core/utils.js.map +++ b/lib/core/utils.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/utils.js"],"names":["recognizeModifierTiming","string","r","arr","res","exec","push","value","momentKey","calcRate","rate","total","amount","mod","substr","length","slice","parseFloat","toFixed","humanParseDiff","secs","hours","Math","floor","minutes","seconds"],"mappings":";;;;;AAAO,IAAMA,4DAA0B,SAA1BA,uBAA0B,CAAUC,MAAV,EAAiB;AACpD,QAAIC,IAAI,kBAAR;AACA,QAAIC,YAAJ;AACA,QAAIC,MAAM,EAAV;AACA,WAAO,CAACD,MAAMD,EAAEG,IAAF,CAAOJ,MAAP,CAAP,MAA2B,IAAlC,EAAwC;AACpCG,YAAIE,IAAJ,CAAS;AACLC,mBAAOJ,IAAI,CAAJ,CADF;AAELK,uBAAWL,IAAI,CAAJ;AAFN,SAAT;AAIH;;AAED,WAAOC,GAAP;AACH,CAZM;;AAcA,IAAMK,8BAAW,SAAXA,QAAW,CAAUC,IAAV,EAAgBC,KAAhB,EAAsB;AAC1C,QAAIC,eAAJ;AACA,QAAIC,MAAMH,KAAKI,MAAL,CAAYJ,KAAKK,MAAL,GAAc,CAA1B,CAAV;AACA,QAAIR,QAAQG,KAAKM,KAAL,CAAW,CAAX,EAAcN,KAAKK,MAAL,GAAc,CAA5B,CAAZ;;AAEA,YAAQF,GAAR;AACI,aAAK,GAAL;AACID,qBAAUD,QAAM,EAAN,GAAS,EAAV,GAAcM,WAAWV,KAAX,CAAvB;AACA;AACJ,aAAK,GAAL;AACIK,qBAAUD,QAAM,EAAP,GAAWM,WAAWV,KAAX,CAApB;AACA;AACJ,aAAK,GAAL;AACIK,qBAASD,QAAMM,WAAWV,KAAX,CAAf;AACA;AATR;;AAYA,WAAOK,OAAOM,OAAP,CAAe,CAAf,CAAP;AACH,CAlBM;;AAoBA,IAAMC,0CAAiB,SAAjBA,cAAiB,CAASC,IAAT,EAAe;AACzC,QAAIC,QAAUC,KAAKC,KAAL,CAAWH,OAAO,IAAlB,CAAd;AACA,QAAII,UAAUF,KAAKC,KAAL,CAAW,CAACH,OAAQC,QAAQ,IAAjB,IAA0B,EAArC,CAAd;AACA,QAAII,UAAUL,OAAQC,QAAQ,IAAhB,GAAyBG,UAAU,EAAjD;AACAH,YAASA,SAAS,CAAT,GAAa,KAAb,GAAqB,CAACA,QAAQ,EAAR,GAAa,MAAMA,KAAnB,GAA2BA,KAA5B,IAAqC,GAAnE;AACAG,cAAYA,WAAW,CAAX,IAAgBH,SAAS,EAA1B,GAAgC,KAAhC,GAAwC,CAACG,UAAU,EAAV,GAAe,MAAMA,OAArB,GAA+BA,OAAhC,IAA2C,GAA9F;AACAC,cAAWA,WAAW,CAAX,GAAe,KAAf,GAAuB,CAACA,UAAW,EAAX,GAAgB,MAAMA,OAAtB,GAAgCA,OAAjC,IAA4C,GAA9E;AACA,WAAUJ,KAAV,SAAmBG,OAAnB,SAA8BC,OAA9B;AACH,CARM","file":"utils.js","sourcesContent":["export const recognizeModifierTiming = function (string){\n let r = /(\\d{1,})([hms])/g\n let arr\n let res = []\n while ((arr = r.exec(string)) !== null) {\n res.push({\n value: arr[1],\n momentKey: arr[2]\n })\n }\n\n return res\n}\n\nexport const calcRate = function (rate, total){\n let amount\n let mod = rate.substr(rate.length - 1)\n let value = rate.slice(0, rate.length - 1)\n\n switch (mod) {\n case 'h':\n amount = (total/60/60)*parseFloat(value)\n break;\n case 'm':\n amount = (total/60)*parseFloat(value)\n break;\n case 's':\n amount = total*parseFloat(value)\n break;\n }\n\n return amount.toFixed(2)\n}\n\nexport const humanParseDiff = function(secs) {\n let hours = Math.floor(secs / 3600)\n let minutes = Math.floor((secs - (hours * 3600)) / 60)\n let seconds = secs - (hours * 3600) - (minutes * 60)\n hours = (hours == 0 ? '00h' : (hours < 10 ? '0' + hours : hours) + 'h')\n minutes = ((minutes == 0 && hours == '') ? '00m' : (minutes < 10 ? '0' + minutes : minutes) + 'm')\n seconds = (seconds == 0 ? '00s' : (seconds < 10 ? '0' + seconds : seconds) + 's')\n return `${hours} ${minutes} ${seconds}`\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/utils.js"],"names":["recognizeModifierTiming","string","r","arr","res","exec","push","value","momentKey","calcRate","rate","total","amount","mod","substr","length","slice","parseFloat","toFixed","humanParseDiff","secs","hours","Math","floor","minutes","seconds","inPeriod","start","stop","fstart","fstop","console","log","isBetween","getSeconds","diff"],"mappings":"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","file":"utils.js","sourcesContent":["import moment from 'moment';\n\nexport const recognizeModifierTiming = function(string) {\n let r = /(\\d{1,})([hms])/g;\n let arr;\n let res = [];\n while ((arr = r.exec(string)) !== null) {\n res.push({\n value: arr[1],\n momentKey: arr[2]\n });\n }\n\n return res;\n};\n\nexport const calcRate = function(rate, total) {\n let amount;\n let mod = rate.substr(rate.length - 1);\n let value = rate.slice(0, rate.length - 1);\n\n switch (mod) {\n case 'h':\n amount = total / 60 / 60 * parseFloat(value);\n break;\n case 'm':\n amount = total / 60 * parseFloat(value);\n break;\n case 's':\n amount = total * parseFloat(value);\n break;\n }\n\n return amount.toFixed(2);\n};\n\nexport const humanParseDiff = function(secs) {\n let hours = Math.floor(secs / 3600);\n let minutes = Math.floor((secs - hours * 3600) / 60);\n let seconds = secs - hours * 3600 - minutes * 60;\n hours = hours == 0 ? '00h' : (hours < 10 ? '0' + hours : hours) + 'h';\n minutes =\n minutes == 0 && hours == ''\n ? '00m'\n : (minutes < 10 ? '0' + minutes : minutes) + 'm';\n seconds = seconds == 0 ? '00s' : (seconds < 10 ? '0' + seconds : seconds) + 's';\n return `${hours} ${minutes} ${seconds}`;\n};\n\nexport const inPeriod = function(start, stop, fstart, fstop) {\n fstart = moment(fstart, 'YYYY/MM/DD');\n fstop = moment(fstop, 'YYYY/MM/DD');\n\n console.log('fstart', fstart);\n console.log('fstop', fstop);\n\n if (\n moment(start).isBetween(fstart, fstop, null, '[]') &&\n moment(stop).isBetween(fstart, fstop, null, '[]')\n ) {\n console.log('start', start);\n console.log('stop', stop);\n return { isBetween: true, start, stop };\n }\n\n if (\n !moment(start).isBetween(fstart, fstop, null, '[]') &&\n moment(stop).isBetween(fstart, fstop, null, '[]')\n ) {\n return { isBetween: true, start: fstart, stop };\n }\n\n if (\n moment(start).isBetween(fstart, fstop, null, '[]') &&\n !moment(stop).isBetween(fstart, fstop, null, '[]')\n ) {\n return { isBetween: true, start, stop: fstop };\n }\n\n return { isBetween: false, start, stop };\n};\n\nexport const getSeconds = ({ start, stop }) => {\n if (stop) {\n return moment(stop).diff(moment(start), 'seconds');\n } else {\n return moment().diff(moment(start), 'seconds');\n }\n};\n"]} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index 6718539..81c9f4b 100644 --- a/lib/index.js +++ b/lib/index.js @@ -104,16 +104,18 @@ _commander2.default.command('log ').description('Logs the time of the EXEC = true; }); -_commander2.default.command('export [task_string]').description('Export the tasks in json (default) or md format').alias('e').option('-f --format [format]').option('-s --start [start date. Example: "2017/05/28"]').option('-e --end [end date. Example: "2018/05/28"]').action(function (key, options) { +_commander2.default.command('export [task_string]').description('Export the tasks in json (default) or md format').alias('e').option('-f --format [format]').option('-s --start [start date. Example: "2017/05/28"]').option('-e --end [end date. Example: "2018/05/28"]').option('-x --expanded [You want to see all timings for a task.]').action(function (key, options) { switch (options.format ? options.format.toLowerCase() : undefined) { - case "json":case undefined: + case 'json': + case undefined: console.log(JSON.stringify(manager.getTasksJson(key, options.start, options.end), null, 4)); break; - case "markdown":case "md": - console.log(manager.getTasksMd(key, options.start, options.end)); + case 'markdown': + case 'md': + console.log(manager.getTasksMd(key, options.start, options.end, options.expanded)); break; default: - console.log("Format not supported"); + console.log('Format not supported'); } EXEC = true; }); diff --git a/lib/index.js.map b/lib/index.js.map index 137a7b0..79788c7 100644 --- a/lib/index.js.map +++ b/lib/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.js"],"names":["config","name","tasks","pkg","notify","manager","EXEC","version","description","option","command","alias","action","key","Array","isArray","join","startTask","pauseTask","unpauseTask","stopTask","text","addDescription","stringTime","modifyTask","sumarize","search","rate","setInterval","getTime","process","stdout","write","moveCursor","options","format","toLowerCase","undefined","console","log","JSON","stringify","getTasksJson","start","end","getTasksMd","string","delete","value","configure","getConfig","parse","argv","updateDB","update","outputHelp","exit"],"mappings":"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","file":"index.js","sourcesContent":["import 'babel-polyfill'\n\nimport program from 'commander'\nimport updateNotifier from 'update-notifier'\nimport Configstore from 'configstore'\nimport pkg from '../package.json'\n\nimport Manager from './core/Manager'\nimport { humanParseDiff } from './core/utils'\nimport { outputVertical, cliError, outputConfig } from './core/output'\n\nimport autocomplete from './autocomplete'\n\nconst config = new Configstore(pkg.name, {\n tasks:{},\n config:{\n 'format.output': 'DD/MM'\n }\n})\n\nupdateNotifier({ pkg }).notify()\n\nconst manager = new Manager(config)\nautocomplete(config)\n\n//Exec\nlet EXEC = false\n\nprogram\n .version(pkg.version)\n .description('Tiny time tracker for projects')\n .option('--updateDB', 'Bool to update the db')\n\nprogram\n .command('start [description]')\n .description('Start task with a description.')\n .alias('s')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.startTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('pause ')\n .description('Pause task')\n .alias('p')\n .action(function(key) {\n manager.pauseTask(key)\n EXEC = true\n })\n\nprogram\n .command('unpause ')\n .description('Unpause task')\n .alias('up')\n .action(function(key) {\n manager.unpauseTask(key)\n EXEC = true\n })\n\n\nprogram\n .command('finish [description]')\n .description('Stop task, you can add a description')\n .alias('f')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.stopTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('description ')\n .description('Add description to your task.')\n .alias('d')\n .action(function(key, text) {\n text = Array.isArray(text) ? text.join(' ') : text\n manager.addDescription(key, text)\n EXEC = true\n })\n\nprogram\n .command('add ')\n .description('Adds time to a task. Example: \"1h2m3s\"')\n .action(function(key, stringTime) {\n manager.modifyTask('add', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('subtract ')\n .description('Subtract time to a task. Example: \"1h2m3s\"')\n .alias('sub')\n .action(function(key, stringTime) {\n manager.modifyTask('subtract', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('report [task_string] [rate]')\n .description('Report time of the tasks, empty for select all tasks. Can pass a rate (1h).')\n .alias('r')\n .action(function(tasks, rate) {\n tasks = (tasks) ? tasks : 'all'\n manager.sumarize(tasks, rate)\n EXEC = true\n })\n\nprogram\n .command('log ')\n .description('Logs the time of the task')\n .alias('l')\n .action(function(key) {\n setInterval(() => {\n let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key)))\n process.stdout.write(text)\n process.stdout.moveCursor(0,-2)\n }, 1000)\n EXEC = true\n })\n\nprogram\n .command('export [task_string]')\n .description('Export the tasks in json (default) or md format')\n .alias('e')\n .option('-f --format [format]')\n .option('-s --start [start date. Example: \"2017/05/28\"]')\n .option('-e --end [end date. Example: \"2018/05/28\"]')\n .action(function(key, options) {\n\t\tswitch (options.format ? options.format.toLowerCase() : undefined){\n\t\t\tcase \"json\": case undefined:\n\t\t\t\tconsole.log(JSON.stringify(manager.getTasksJson(key, options.start, options.end), null, 4))\n\t\t\t\tbreak\n\t\t\tcase \"markdown\": case \"md\":\n\t\t\t\tconsole.log(manager.getTasksMd(key, options.start, options.end))\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tconsole.log(\"Format not supported\")\n\t\t}\n EXEC = true\n })\n\nprogram\n .command('delete [task_string]')\n .description('Remove tasks from the list. Empty for select all tasks')\n .alias('del')\n .action(function(string) {\n string = (string) ? string : 'all'\n manager.delete(string)\n EXEC = true\n })\n\nprogram\n .command('configure ')\n .description('Configure the value of the config passing a key')\n .action(function(key, value) {\n manager.configure(key, value)\n EXEC = true\n })\n\nprogram\n .command('configuration')\n .description('Output configuration')\n .action(function(string) {\n outputConfig(manager.getConfig())\n EXEC = true\n })\n\nprogram\n .parse(process.argv)\n\n\nif (program.updateDB) {\n manager.update()\n EXEC = true\n}\n\nif (!EXEC) {\n cliError('You must use a valid command.')\n program.outputHelp()\n process.exit(1)\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/index.js"],"names":["config","name","tasks","pkg","notify","manager","EXEC","version","description","option","command","alias","action","key","Array","isArray","join","startTask","pauseTask","unpauseTask","stopTask","text","addDescription","stringTime","modifyTask","sumarize","search","rate","setInterval","getTime","process","stdout","write","moveCursor","options","format","toLowerCase","undefined","console","log","JSON","stringify","getTasksJson","start","end","getTasksMd","expanded","string","delete","value","configure","getConfig","parse","argv","updateDB","update","outputHelp","exit"],"mappings":";;AAAA;;AAEA;;;;AACA;;;;AACA;;;;AACA;;;;AAEA;;;;AACA;;AACA;;AAEA;;;;;;AAEA,IAAMA,SAAS,0BAAgB,kBAAIC,IAApB,EAA0B;AACrCC,WAAO,EAD8B;AAErCF,YAAQ;AACJ,yBAAiB;AADb;AAF6B,CAA1B,CAAf;;AAOA,8BAAe,EAAEG,sBAAF,EAAf,EAAwBC,MAAxB;;AAEA,IAAMC,UAAU,sBAAYL,MAAZ,CAAhB;AACA,4BAAaA,MAAb;;AAEA;AACA,IAAIM,OAAO,KAAX;;AAEA,oBACKC,OADL,CACa,kBAAIA,OADjB,EAEKC,WAFL,CAEiB,gCAFjB,EAGKC,MAHL,CAGY,YAHZ,EAG0B,uBAH1B;;AAKA,oBACKC,OADL,CACa,gCADb,EAEKF,WAFL,CAEiB,gCAFjB,EAGKG,KAHL,CAGW,GAHX,EAIKC,MAJL,CAIY,UAASC,GAAT,EAAcL,WAAd,EAA2B;AAC/BA,kBAAcA,cACRM,MAAMC,OAAN,CAAcP,WAAd,IAA6BA,YAAYQ,IAAZ,CAAiB,GAAjB,CAA7B,GAAqDR,WAD7C,GAER,IAFN;AAGAH,YAAQY,SAAR,CAAkBJ,GAAlB,EAAuBL,WAAvB;AACAF,WAAO,IAAP;AACH,CAVL;;AAYA,oBACKI,OADL,CACa,kBADb,EAEKF,WAFL,CAEiB,YAFjB,EAGKG,KAHL,CAGW,GAHX,EAIKC,MAJL,CAIY,UAASC,GAAT,EAAc;AAClBR,YAAQa,SAAR,CAAkBL,GAAlB;AACAP,WAAO,IAAP;AACH,CAPL;;AASA,oBACKI,OADL,CACa,oBADb,EAEKF,WAFL,CAEiB,cAFjB,EAGKG,KAHL,CAGW,IAHX,EAIKC,MAJL,CAIY,UAASC,GAAT,EAAc;AAClBR,YAAQc,WAAR,CAAoBN,GAApB;AACAP,WAAO,IAAP;AACH,CAPL;;AASA,oBACKI,OADL,CACa,iCADb,EAEKF,WAFL,CAEiB,sCAFjB,EAGKG,KAHL,CAGW,GAHX,EAIKC,MAJL,CAIY,UAASC,GAAT,EAAcL,WAAd,EAA2B;AAC/BA,kBAAcA,cACRM,MAAMC,OAAN,CAAcP,WAAd,IAA6BA,YAAYQ,IAAZ,CAAiB,GAAjB,CAA7B,GAAqDR,WAD7C,GAER,IAFN;AAGAH,YAAQe,QAAR,CAAiBP,GAAjB,EAAsBL,WAAtB;AACAF,WAAO,IAAP;AACH,CAVL;;AAYA,oBACKI,OADL,CACa,6CADb,EAEKF,WAFL,CAEiB,+BAFjB,EAGKG,KAHL,CAGW,GAHX,EAIKC,MAJL,CAIY,UAASC,GAAT,EAAcQ,IAAd,EAAoB;AACxBA,WAAOP,MAAMC,OAAN,CAAcM,IAAd,IAAsBA,KAAKL,IAAL,CAAU,GAAV,CAAtB,GAAuCK,IAA9C;AACAhB,YAAQiB,cAAR,CAAuBT,GAAvB,EAA4BQ,IAA5B;AACAf,WAAO,IAAP;AACH,CARL;;AAUA,oBACKI,OADL,CACa,6BADb,EAEKF,WAFL,CAEiB,wCAFjB,EAGKI,MAHL,CAGY,UAASC,GAAT,EAAcU,UAAd,EAA0B;AAC9BlB,YAAQmB,UAAR,CAAmB,KAAnB,EAA0BX,GAA1B,EAA+BU,UAA/B;AACAlB,YAAQoB,QAAR,CAAiBZ,GAAjB,EAAsBR,QAAQqB,MAAR,CAAeb,GAAf,CAAtB,EAA2C,KAA3C;AACAP,WAAO,IAAP;AACH,CAPL;;AASA,oBACKI,OADL,CACa,kCADb,EAEKF,WAFL,CAEiB,4CAFjB,EAGKG,KAHL,CAGW,KAHX,EAIKC,MAJL,CAIY,UAASC,GAAT,EAAcU,UAAd,EAA0B;AAC9BlB,YAAQmB,UAAR,CAAmB,UAAnB,EAA+BX,GAA/B,EAAoCU,UAApC;AACAlB,YAAQoB,QAAR,CAAiBZ,GAAjB,EAAsBR,QAAQqB,MAAR,CAAeb,GAAf,CAAtB,EAA2C,KAA3C;AACAP,WAAO,IAAP;AACH,CARL;;AAUA,oBACKI,OADL,CACa,6BADb,EAEKF,WAFL,CAGQ,6EAHR,EAKKG,KALL,CAKW,GALX,EAMKC,MANL,CAMY,UAASV,KAAT,EAAgByB,IAAhB,EAAsB;AAC1BzB,YAAQA,QAAQA,KAAR,GAAgB,KAAxB;AACAG,YAAQoB,QAAR,CAAiBvB,KAAjB,EAAwByB,IAAxB;AACArB,WAAO,IAAP;AACH,CAVL;;AAYA,oBACKI,OADL,CACa,gBADb,EAEKF,WAFL,CAEiB,4BAFjB,EAGKG,KAHL,CAGW,GAHX,EAIKC,MAJL,CAIY,UAASC,GAAT,EAAc;AAClBe,gBAAY,YAAM;AACd,YAAIP,OAAO,4BAAe,OAAf,EAAwBR,GAAxB,EAA6B,2BAAeR,QAAQwB,OAAR,CAAgBhB,GAAhB,CAAf,CAA7B,CAAX;AACAiB,gBAAQC,MAAR,CAAeC,KAAf,CAAqBX,IAArB;AACAS,gBAAQC,MAAR,CAAeE,UAAf,CAA0B,CAA1B,EAA6B,CAAC,CAA9B;AACH,KAJD,EAIG,IAJH;AAKA3B,WAAO,IAAP;AACH,CAXL;;AAaA,oBACKI,OADL,CACa,sBADb,EAEKF,WAFL,CAEiB,iDAFjB,EAGKG,KAHL,CAGW,GAHX,EAIKF,MAJL,CAIY,sBAJZ,EAKKA,MALL,CAKY,gDALZ,EAMKA,MANL,CAMY,4CANZ,EAOKA,MAPL,CAOY,yDAPZ,EAQKG,MARL,CAQY,UAASC,GAAT,EAAcqB,OAAd,EAAuB;AAC3B,YAAQA,QAAQC,MAAR,GAAiBD,QAAQC,MAAR,CAAeC,WAAf,EAAjB,GAAgDC,SAAxD;AACI,aAAK,MAAL;AACA,aAAKA,SAAL;AACIC,oBAAQC,GAAR,CACIC,KAAKC,SAAL,CACIpC,QAAQqC,YAAR,CAAqB7B,GAArB,EAA0BqB,QAAQS,KAAlC,EAAyCT,QAAQU,GAAjD,CADJ,EAEI,IAFJ,EAGI,CAHJ,CADJ;AAOA;AACJ,aAAK,UAAL;AACA,aAAK,IAAL;AACIN,oBAAQC,GAAR,CACIlC,QAAQwC,UAAR,CAAmBhC,GAAnB,EAAwBqB,QAAQS,KAAhC,EAAuCT,QAAQU,GAA/C,EAAoDV,QAAQY,QAA5D,CADJ;AAGA;AACJ;AACIR,oBAAQC,GAAR,CAAY,sBAAZ;AAlBR;AAoBAjC,WAAO,IAAP;AACH,CA9BL;;AAgCA,oBACKI,OADL,CACa,sBADb,EAEKF,WAFL,CAEiB,wDAFjB,EAGKG,KAHL,CAGW,KAHX,EAIKC,MAJL,CAIY,UAASmC,MAAT,EAAiB;AACrBA,aAASA,SAASA,MAAT,GAAkB,KAA3B;AACA1C,YAAQ2C,MAAR,CAAeD,MAAf;AACAzC,WAAO,IAAP;AACH,CARL;;AAUA,oBACKI,OADL,CACa,yBADb,EAEKF,WAFL,CAEiB,iDAFjB,EAGKI,MAHL,CAGY,UAASC,GAAT,EAAcoC,KAAd,EAAqB;AACzB5C,YAAQ6C,SAAR,CAAkBrC,GAAlB,EAAuBoC,KAAvB;AACA3C,WAAO,IAAP;AACH,CANL;;AAQA,oBACKI,OADL,CACa,eADb,EAEKF,WAFL,CAEiB,sBAFjB,EAGKI,MAHL,CAGY,UAASmC,MAAT,EAAiB;AACrB,8BAAa1C,QAAQ8C,SAAR,EAAb;AACA7C,WAAO,IAAP;AACH,CANL;;AAQA,oBAAQ8C,KAAR,CAActB,QAAQuB,IAAtB;;AAEA,IAAI,oBAAQC,QAAZ,EAAsB;AAClBjD,YAAQkD,MAAR;AACAjD,WAAO,IAAP;AACH;;AAED,IAAI,CAACA,IAAL,EAAW;AACP,0BAAS,+BAAT;AACA,wBAAQkD,UAAR;AACA1B,YAAQ2B,IAAR,CAAa,CAAb;AACH","file":"index.js","sourcesContent":["import 'babel-polyfill';\n\nimport program from 'commander';\nimport updateNotifier from 'update-notifier';\nimport Configstore from 'configstore';\nimport pkg from '../package.json';\n\nimport Manager from './core/Manager';\nimport { humanParseDiff } from './core/utils';\nimport { outputVertical, cliError, outputConfig } from './core/output';\n\nimport autocomplete from './autocomplete';\n\nconst config = new Configstore(pkg.name, {\n tasks: {},\n config: {\n 'format.output': 'DD/MM'\n }\n});\n\nupdateNotifier({ pkg }).notify();\n\nconst manager = new Manager(config);\nautocomplete(config);\n\n//Exec\nlet EXEC = false;\n\nprogram\n .version(pkg.version)\n .description('Tiny time tracker for projects')\n .option('--updateDB', 'Bool to update the db');\n\nprogram\n .command('start [description]')\n .description('Start task with a description.')\n .alias('s')\n .action(function(key, description) {\n description = description\n ? Array.isArray(description) ? description.join(' ') : description\n : null;\n manager.startTask(key, description);\n EXEC = true;\n });\n\nprogram\n .command('pause ')\n .description('Pause task')\n .alias('p')\n .action(function(key) {\n manager.pauseTask(key);\n EXEC = true;\n });\n\nprogram\n .command('unpause ')\n .description('Unpause task')\n .alias('up')\n .action(function(key) {\n manager.unpauseTask(key);\n EXEC = true;\n });\n\nprogram\n .command('finish [description]')\n .description('Stop task, you can add a description')\n .alias('f')\n .action(function(key, description) {\n description = description\n ? Array.isArray(description) ? description.join(' ') : description\n : null;\n manager.stopTask(key, description);\n EXEC = true;\n });\n\nprogram\n .command('description ')\n .description('Add description to your task.')\n .alias('d')\n .action(function(key, text) {\n text = Array.isArray(text) ? text.join(' ') : text;\n manager.addDescription(key, text);\n EXEC = true;\n });\n\nprogram\n .command('add ')\n .description('Adds time to a task. Example: \"1h2m3s\"')\n .action(function(key, stringTime) {\n manager.modifyTask('add', key, stringTime);\n manager.sumarize(key, manager.search(key), false);\n EXEC = true;\n });\n\nprogram\n .command('subtract ')\n .description('Subtract time to a task. Example: \"1h2m3s\"')\n .alias('sub')\n .action(function(key, stringTime) {\n manager.modifyTask('subtract', key, stringTime);\n manager.sumarize(key, manager.search(key), false);\n EXEC = true;\n });\n\nprogram\n .command('report [task_string] [rate]')\n .description(\n 'Report time of the tasks, empty for select all tasks. Can pass a rate (1h).'\n )\n .alias('r')\n .action(function(tasks, rate) {\n tasks = tasks ? tasks : 'all';\n manager.sumarize(tasks, rate);\n EXEC = true;\n });\n\nprogram\n .command('log ')\n .description('Logs the time of the task')\n .alias('l')\n .action(function(key) {\n setInterval(() => {\n let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key)));\n process.stdout.write(text);\n process.stdout.moveCursor(0, -2);\n }, 1000);\n EXEC = true;\n });\n\nprogram\n .command('export [task_string]')\n .description('Export the tasks in json (default) or md format')\n .alias('e')\n .option('-f --format [format]')\n .option('-s --start [start date. Example: \"2017/05/28\"]')\n .option('-e --end [end date. Example: \"2018/05/28\"]')\n .option('-x --expanded [You want to see all timings for a task.]')\n .action(function(key, options) {\n switch (options.format ? options.format.toLowerCase() : undefined) {\n case 'json':\n case undefined:\n console.log(\n JSON.stringify(\n manager.getTasksJson(key, options.start, options.end),\n null,\n 4\n )\n );\n break;\n case 'markdown':\n case 'md':\n console.log(\n manager.getTasksMd(key, options.start, options.end, options.expanded)\n );\n break;\n default:\n console.log('Format not supported');\n }\n EXEC = true;\n });\n\nprogram\n .command('delete [task_string]')\n .description('Remove tasks from the list. Empty for select all tasks')\n .alias('del')\n .action(function(string) {\n string = string ? string : 'all';\n manager.delete(string);\n EXEC = true;\n });\n\nprogram\n .command('configure ')\n .description('Configure the value of the config passing a key')\n .action(function(key, value) {\n manager.configure(key, value);\n EXEC = true;\n });\n\nprogram\n .command('configuration')\n .description('Output configuration')\n .action(function(string) {\n outputConfig(manager.getConfig());\n EXEC = true;\n });\n\nprogram.parse(process.argv);\n\nif (program.updateDB) {\n manager.update();\n EXEC = true;\n}\n\nif (!EXEC) {\n cliError('You must use a valid command.');\n program.outputHelp();\n process.exit(1);\n}\n"]} \ No newline at end of file From 7ddadee713a4d85b93e98690ef38502cb222e55c Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:38:05 +0800 Subject: [PATCH 08/10] Updates on Readme --- README.md | 190 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 172 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index d589363..83c62b2 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,13 @@ ``` npm install -g time-tracker-cli ``` + or + ``` yarn global add time-tracker-cli ``` + Now you can start to call `timer`command ## Usage @@ -26,7 +29,16 @@ Now you can start to call `timer`command ``` └┘#! timer -Usage: timer [options] [command] + Usage: timer [options] [command] + + Tiny time tracker for projects + + + Options: + + -V, --version output the version number + --updateDB Bool to update the db + -h, --help output usage information Commands: @@ -39,39 +51,39 @@ Usage: timer [options] [command] add Adds time to a task. Example: "1h2m3s" subtract|sub Subtract time to a task. Example: "1h2m3s" report|r [task_string] [rate] Report time of the tasks, empty for select all tasks. Can pass a rate (1h). - log|l Logs the time of the task - export|e Export the tasks in a JSON + log|l Logs the time of the task + export|e [options] [task_string] Export the tasks in json (default) or md format delete|del [task_string] Remove tasks from the list. Empty for select all tasks configure Configure the value of the config passing a key configuration Output configuration - - Tiny time tracker for projects - - Options: - - -h, --help output usage information - -V, --version output the version number - --updateDB Update the db if its neccesary ``` -- To start a task run: +* To start a task run: + ``` $ timer start ``` -- To finish a task run: + +* To finish a task run: + ``` $ timer finish ``` -- You can add a description adding: + +* You can add a description adding: + ``` $ timer description ``` -- You can also see the timer running: + +* You can also see the timer running: + ``` $ timer log ``` ## How it works + The data are stored inside ~/.config/time-tracker-cli.json The config need to be updated if you have the 1.x to the 2.x to do that, to update config run timer --updateDB If you open you should see: @@ -128,19 +140,161 @@ If you open you should see: } ``` +## Method + +### Start (start|s) + +Start a new task. + +``` +$ timer start +``` + +### Pause (pause|p) + +Pause a task + +``` +$ timer pause +$ timer p +``` + +### Unpause (unpause|up) + +Unpause a task + +``` +$ timer unpause +$ timer up +``` + +### Finish (finish|f) + +Stop a task, also can add a description + +``` +$ timer finish +``` + +### Description (description|d) + +Add a description to the task + +``` +$ timer description +$ timer d +``` + +### Add (add) + +Add time to the task selected + +``` +$ timer add +$ timer add 1h2m3s +``` + +### Subtract (subtract|sub) + +Subtract time to the task selected + +``` +$ timer subtract +$ timer sub +$ timer subtract 1h2m3s +$ timer sub 1h2m3s +``` + +### Report (report|r) + +This method outputs via cli a table. Some examples: + +``` +$ timer report +$ timer r -f md +$ timer r -f markdown +$ timer r -f markdown > report.md +$ timer r -f md > report.md +$ timer r > report.json +$ timer export +$ timer r -f md +$ timer r -f markdown +$ timer r -f markdown > report.md +$ timer r -f md > report.md +$ timer r > report.json +``` + +### Log (log|l) + +log|l Logs the time of the task + +### Export (export|e) + +This method output a json or markdown with all the tasks or all the selected tasks. + +Options: + +* -f --format: define the format (default is json). Ex. json|markdown|md +* -s --start: filter by start date. Ex. 2017/05/28 +* -e --end: filter by start date. Ex. 2017/05/28 +* -x --expanded: If you have mutiple days in a task, expands shows this as a independant entry on the table. Default is false + +In 2.5.0 its included an export option that has json and markdown as valid outputs, this are some examples: + +``` +$ timer export +$ timer e -f md +$ timer e -f markdown +$ timer e -f markdown > report.md +$ timer e -f md > report.md +$ timer e > report.json +$ timer export +$ timer e -f md +$ timer e -f markdown +$ timer e -f markdown > report.md +$ timer e -f md > report.md +$ timer e > report.json +$ timer e -f md -x -e 2017/08/26 +$ timer e -f md -x -s 2017/08/26 +$ timer e -f md -e 2017/08/26 +$ timer e -f md -s 2017/08/26 +``` + +Thanks [@MarAvFe][maravfe] and [@mlndz28][mlndz28] for its contribution. + +### Delete (delete|del) + +delete|del [task_string] Remove tasks from the list. Empty for select all tasks + +### Configure (configure) + +configure Configure the value of the config passing a key + +### Configure (configure) + +configuration + ## Notes + To use the autocomplete run `timer --setupCLI` If you have the version 1.x and you want to conserve the DB, run `timer --updateDB` to update the DB to version 2.x ## Development -Run ```npm install;npm run dev``` to watch the proyect, and compile the code automatically. -Run ```npm build``` to build the module. +Run `npm install;npm run dev` to watch the proyect, and compile the code automatically. +Run `npm build` to build the module. + +## Contributors + +* [@MarAvFe][maravfe] +* [@mlndz28][mlndz28] ## License -Licensed under the MIT license. 2015 +Licensed under the MIT license. 2015 [paypal-badge]: https://img.shields.io/badge/❤%20support-paypal-blue.svg?style=flat-square [paypal-link]: https://www.paypal.me/danibram [npm-home-module]: https://www.npmjs.com/package/time-tracker-cli +[maravfe]: https://github.com/MarAvFe +[mlndz28]: https://github.com/mlndz28 From 956b06fdb45ff08324cf8373f63c41171a968714 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:40:49 +0800 Subject: [PATCH 09/10] fix Readme --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 83c62b2..f0af4c5 100644 --- a/README.md +++ b/README.md @@ -226,7 +226,11 @@ $ timer r > report.json ### Log (log|l) -log|l Logs the time of the task +Log a task if you want to have the real timer on one console. + +``` +$ timer log +``` ### Export (export|e) From 512cd05117de0139de595992f5d4b82c5b9695fe Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:43:11 +0800 Subject: [PATCH 10/10] update contributors --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index f0af4c5..849f1a3 100644 --- a/README.md +++ b/README.md @@ -292,6 +292,8 @@ Run `npm build` to build the module. * [@MarAvFe][maravfe] * [@mlndz28][mlndz28] +* [@RyanZim][ryanzim] +* [@kohei-takata][kohei-takata] ## License @@ -302,3 +304,5 @@ Licensed under the MIT license. 2015 [npm-home-module]: https://www.npmjs.com/package/time-tracker-cli [maravfe]: https://github.com/MarAvFe [mlndz28]: https://github.com/mlndz28 +[ryanzim]: https://github.com/RyanZim +[kohei-takata]: https://github.com/kohei-takata