diff --git a/.editorconfig b/.editorconfig index 2536d66..a7eefe7 100644 --- a/.editorconfig +++ b/.editorconfig @@ -2,11 +2,8 @@ root = true [*] -indent_style = space -indent_size = 4 +indent_style = tab +indent_size = 2 charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false diff --git a/README.md b/README.md index adf1ad6..7481b95 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,33 @@ # Tiny Time tracker -[![NPM](https://nodei.co/npm/time-tracker-cli.png?downloads=true)][npm-home-module] -[![npm version](https://img.shields.io/npm/v/time-tracker-cli.svg?style=flat-square)](https://github.com/danibram/time-tracker-cli) +## Project State -[![Dependency Status](https://img.shields.io/bithound/dependencies/github/danibram/time-tracker-cli.svg?style=flat-square)](https://www.bithound.io/github/danibram/time-tracker-cli) -[![Support link][paypal-badge]][paypal-link] +This CLI time tracker is based on [danibram's work](https://github.com/danibram/time-tracker-cli) and tries to improve on it. + +### Changes: + +- Timer status (`status` or `st`): Is there a timer running? Which tasks? +- `summarize` (or `sum`) `task 12h` calculates the time spent on `task` during the last 12 hours +- `p` pauses all tasks unless specified, `up` unpauses them +- Durations can be stated in days (`3d`), weeks (`1w`), and months (`1M`) + +### Wishlist: + +- Respond with overview over running and saved tasks +- Starting a task stops all others unless specified with an option +- Ask if user starts a new task (might be a typo) +- `f` finishes all running tasks unless specified +- Date not in UTC, but local timezone +- Show a task's raw data, optionally filtered by time range +- Autocomplete commands (built-in, but cannot make it work) and tasks +- Can we pause tasks automatically when the computer goes into sleep mode? +- Data clean-up (performance): Calculate sum, label and save it, delete timings +- Data backup +- "del x" finds "x" and "x.y", no way to pick only "x" +- Logging acts weird on the console when no task is running +- Show timer state on desktop or in browser (with an addon) + +Okay, I got carried away with the last one. ## Installation @@ -29,27 +52,27 @@ Usage: timer [options] [command] Commands: - start|s [description] Start task with a description. - pause|p Pause task - unpause|up Unpause task - finish|f [description] Stop task, you can add a description - description|d Add description to your task. - 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 - 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 + start|s [description] Start task with a description. + pause|p Pause task + unpause|up Unpause task + finish|f [description] Stop task, you can add a description + description|d Add description to your task. + 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 + 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 + -h, --help output usage information + -V, --version output the version number + --updateDB Update the db if its neccesary ``` - To start a task run: @@ -76,53 +99,53 @@ If you open you should see: ```javascript { - "tasks": { - "work1.website.design": { - "description": "If you added one", - "timings": [{ - "start": "2016-02-19T10:00:36.393Z", - "stop": "2016-02-19T18:01:50.921Z" - }], - "log": [ - "start#2016-02-19T10:00:36.393Z", - "stop#2016-02-19T18:01:50.921Z" - ] - }, - "work1.website.deployServer": { - "timings": [{ - "start": "2016-02-19T10:01:59.116Z", - "stop": "2016-02-19T10:32:10.687Z" - }], - "log": [ - "start#2016-02-19T10:01:59.116Z", - "stop#2016-02-19T10:32:10.687Z" - ] - }, - "work2.api.develop.userController": { - "timings": [{ - "start": "2016-02-19T10:04:23.060Z", - "stop": "2016-02-19T20:04:36.836Z" - }], - "log": [ - "start#2016-02-19T10:04:23.060Z", - "stop#2016-02-19T20:04:36.836Z" - ] - }, - "work2.api.develop.loginController": { - "timings": [{ - "start": "2016-02-19T10:09:41.848Z", - "stop": "2016-02-19T13:11:54.059Z" - }], - "log": [ - "start#2016-02-19T10:09:41.848Z", - "stop#2016-02-19T13:11:54.059Z" - ] - } - }, - "config": { - "format.output": "DD/MM", - "config.version": 2 - } + "tasks": { + "work1.website.design": { + "description": "If you added one", + "timings": [{ + "start": "2016-02-19T10:00:36.393Z", + "stop": "2016-02-19T18:01:50.921Z" + }], + "log": [ + "start#2016-02-19T10:00:36.393Z", + "stop#2016-02-19T18:01:50.921Z" + ] + }, + "work1.website.deployServer": { + "timings": [{ + "start": "2016-02-19T10:01:59.116Z", + "stop": "2016-02-19T10:32:10.687Z" + }], + "log": [ + "start#2016-02-19T10:01:59.116Z", + "stop#2016-02-19T10:32:10.687Z" + ] + }, + "work2.api.develop.userController": { + "timings": [{ + "start": "2016-02-19T10:04:23.060Z", + "stop": "2016-02-19T20:04:36.836Z" + }], + "log": [ + "start#2016-02-19T10:04:23.060Z", + "stop#2016-02-19T20:04:36.836Z" + ] + }, + "work2.api.develop.loginController": { + "timings": [{ + "start": "2016-02-19T10:09:41.848Z", + "stop": "2016-02-19T13:11:54.059Z" + }], + "log": [ + "start#2016-02-19T10:09:41.848Z", + "stop#2016-02-19T13:11:54.059Z" + ] + } + }, + "config": { + "format.output": "DD/MM", + "config.version": 2 + } } ``` @@ -137,8 +160,3 @@ Run ```npm build``` to build the module. ## License 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 diff --git a/lib/autocomplete.js b/lib/autocomplete.js index 01cb0a8..c408e7b 100644 --- a/lib/autocomplete.js +++ b/lib/autocomplete.js @@ -1,7 +1,7 @@ 'use strict'; Object.defineProperty(exports, "__esModule", { - value: true + value: true }); var _omelette = require('omelette'); @@ -14,33 +14,27 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de var autocomplete = function autocomplete(config) { - var complete = (0, _omelette2.default)("timer "); + var complete = (0, _omelette2.default)("timer "); - var allTaskKeys = function allTaskKeys() { - this.reply(Object.keys(config.all.tasks)); - }; + var allTaskKeys = function allTaskKeys() { + this.reply(Object.keys(config.all.tasks)); + }; - complete.on("cmd", function () { - this.reply(["start", "pause", "unpause", "finish", "description", "add", "subtract", "report", "log", "export", "delete", "configuration", "configure"]); - }); + complete.on("cmd", function () { + this.reply(["start", "pause", "unpause", "finish", "description", "add", "subtract", "report", "log", "export", "delete", "configuration", "configure"]); + }); - complete.on("key", function (cmd) { - var keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove']; + complete.on("key", function (cmd) { + var keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove']; + if (keyTasks.indexOf(cmd) > -1) this.reply(Object.keys(config.all.tasks)); + if (cmd === 'configure') this.reply(_constants.configElements); + }); - if (keyTasks.indexOf(cmd) > -1) { - this.reply(Object.keys(config.all.tasks)); - } + complete.init(); - if (cmd === 'configure') { - this.reply(_constants.configElements); - } - }); - - complete.init(); - - if (~process.argv.indexOf('--setupCLI')) { - complete.setupShellInitFile(); - } + if (~process.argv.indexOf('--setupCLI')) { + complete.setupShellInitFile(); + } }; exports.default = autocomplete; diff --git a/lib/autocomplete.js.map b/lib/autocomplete.js.map index 09e4110..0e38272 100644 --- a/lib/autocomplete.js.map +++ b/lib/autocomplete.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/autocomplete.js"],"names":["autocomplete","config","complete","allTaskKeys","reply","Object","keys","all","tasks","on","cmd","keyTasks","indexOf","init","process","argv","setupShellInitFile"],"mappings":";;;;;;AAAA;;;;AACA;;;;AAEA,IAAMA,eAAe,SAAfA,YAAe,CAASC,MAAT,EAAgB;;AAEjC,QAAMC,WAAW,wBAAS,mBAAT,CAAjB;;AAEA,QAAIC,cAAc,SAAdA,WAAc,GAAW;AACzB,aAAKC,KAAL,CAAWC,OAAOC,IAAP,CAAYL,OAAOM,GAAP,CAAWC,KAAvB,CAAX;AACH,KAFD;;AAIAN,aAASO,EAAT,CAAY,KAAZ,EAAmB,YAAW;AAC1B,aAAKL,KAAL,CAAW,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,aAAxC,EAAuD,KAAvD,EAA8D,UAA9D,EAA0E,QAA1E,EAAoF,KAApF,EAA2F,QAA3F,EAAqG,QAArG,EAA+G,eAA/G,EAAgI,WAAhI,CAAX;AACH,KAFD;;AAIAF,aAASO,EAAT,CAAY,KAAZ,EAAmB,UAASC,GAAT,EAAc;AAC7B,YAAIC,WAAW,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,KAAxC,EAA+C,aAA/C,EAA8D,KAA9D,EAAqE,QAArE,CAAf;;AAEA,YAAIA,SAASC,OAAT,CAAiBF,GAAjB,IAAwB,CAAC,CAA7B,EAA+B;AAC3B,iBAAKN,KAAL,CAAWC,OAAOC,IAAP,CAAYL,OAAOM,GAAP,CAAWC,KAAvB,CAAX;AACH;;AAED,YAAIE,QAAQ,WAAZ,EAAyB;AACrB,iBAAKN,KAAL;AACH;AACJ,KAVD;;AAYAF,aAASW,IAAT;;AAEA,QAAI,CAACC,QAAQC,IAAR,CAAaH,OAAb,CAAqB,YAArB,CAAL,EAAyC;AACrCV,iBAASc,kBAAT;AACH;AAEJ,CA9BD;;kBAgCehB,Y","file":"autocomplete.js","sourcesContent":["import omelette from 'omelette'\nimport { configElements } from './core/constants'\n\nconst autocomplete = function(config){\n\n const complete = omelette(\"timer \")\n\n let allTaskKeys = function() {\n this.reply(Object.keys(config.all.tasks));\n }\n\n complete.on(\"cmd\", function() {\n this.reply([\"start\", \"pause\", \"unpause\", \"finish\", \"description\", \"add\", \"subtract\", \"report\", \"log\", \"export\", \"delete\", \"configuration\", \"configure\"])\n });\n\n complete.on(\"key\", function(cmd) {\n let keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove']\n\n if (keyTasks.indexOf(cmd) > -1){\n this.reply(Object.keys(config.all.tasks));\n }\n\n if (cmd === 'configure' ){\n this.reply(configElements);\n }\n });\n\n complete.init();\n\n if (~process.argv.indexOf('--setupCLI')) {\n complete.setupShellInitFile();\n }\n\n}\n\nexport default autocomplete\n"]} \ No newline at end of file +{"version":3,"sources":["../src/autocomplete.js"],"names":["autocomplete","config","complete","allTaskKeys","reply","Object","keys","all","tasks","on","cmd","keyTasks","indexOf","init","process","argv","setupShellInitFile"],"mappings":";;;;;;AAAA;;;;AACA;;;;AAEA,IAAMA,eAAe,SAAfA,YAAe,CAASC,MAAT,EAAiB;;AAErC,KAAMC,WAAW,wBAAS,mBAAT,CAAjB;;AAEA,KAAIC,cAAc,SAAdA,WAAc,GAAW;AAC5B,OAAKC,KAAL,CAAWC,OAAOC,IAAP,CAAYL,OAAOM,GAAP,CAAWC,KAAvB,CAAX;AACA,EAFD;;AAIAN,UAASO,EAAT,CAAY,KAAZ,EAAmB,YAAW;AAC7B,OAAKL,KAAL,CAAW,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,aAAxC,EAAuD,KAAvD,EAA8D,UAA9D,EAA0E,QAA1E,EAAoF,KAApF,EAA2F,QAA3F,EAAqG,QAArG,EAA+G,eAA/G,EAAgI,WAAhI,CAAX;AACA,EAFD;;AAIAF,UAASO,EAAT,CAAY,KAAZ,EAAmB,UAASC,GAAT,EAAc;AAChC,MAAIC,WAAW,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,KAAxC,EAA+C,aAA/C,EAA8D,KAA9D,EAAqE,QAArE,CAAf;AACA,MAAIA,SAASC,OAAT,CAAiBF,GAAjB,IAAwB,CAAC,CAA7B,EACC,KAAKN,KAAL,CAAWC,OAAOC,IAAP,CAAYL,OAAOM,GAAP,CAAWC,KAAvB,CAAX;AACD,MAAIE,QAAQ,WAAZ,EACC,KAAKN,KAAL;AACD,EAND;;AAQAF,UAASW,IAAT;;AAEA,KAAI,CAACC,QAAQC,IAAR,CAAaH,OAAb,CAAqB,YAArB,CAAL,EAAyC;AACxCV,WAASc,kBAAT;AACA;AACD,CAzBD;;kBA2BehB,Y","file":"autocomplete.js","sourcesContent":["import omelette from 'omelette'\nimport {configElements} from './core/constants'\n\nconst autocomplete = function(config) {\n\n\tconst complete = omelette(\"timer \")\n\n\tlet allTaskKeys = function() {\n\t\tthis.reply(Object.keys(config.all.tasks));\n\t}\n\n\tcomplete.on(\"cmd\", function() {\n\t\tthis.reply([\"start\", \"pause\", \"unpause\", \"finish\", \"description\", \"add\", \"subtract\", \"report\", \"log\", \"export\", \"delete\", \"configuration\", \"configure\"])\n\t});\n\n\tcomplete.on(\"key\", function(cmd) {\n\t\tlet keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove']\n\t\tif (keyTasks.indexOf(cmd) > -1)\n\t\t\tthis.reply(Object.keys(config.all.tasks));\n\t\tif (cmd === 'configure')\n\t\t\tthis.reply(configElements);\n\t});\n\n\tcomplete.init();\n\n\tif (~process.argv.indexOf('--setupCLI')) {\n\t\tcomplete.setupShellInitFile();\n\t}\n}\n\nexport default autocomplete\n"]} \ No newline at end of file diff --git a/lib/core/Manager.js b/lib/core/Manager.js index 7db44ce..8afc932 100644 --- a/lib/core/Manager.js +++ b/lib/core/Manager.js @@ -1,7 +1,7 @@ 'use strict'; Object.defineProperty(exports, "__esModule", { - value: true + value: true }); exports.default = undefined; @@ -38,207 +38,268 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Manager = function () { - function Manager(cfg) { - _classCallCheck(this, Manager); - - this.repositories = ['tasks', 'config']; - - this.cfg = cfg; - this.tasks = cfg.all.tasks; - this.config = cfg.all.config ? cfg.all.config : {}; - } - - _createClass(Manager, [{ - key: 'getTask', - value: function getTask(key) { - var task = this.tasks[key] ? this.tasks[key] : null; - return new _Task2.default(task); - } - }, { - key: 'storeTask', - value: function storeTask(key, task) { - var update = {}; - update[key] = task.get(); - this.tasks = Object.assign({}, this.tasks, update); - this.cfg.set('tasks', this.tasks); - } - }, { - key: 'startTask', - value: function startTask(key, description) { - var _this = this; - - var t = this.getTask(key); - t.start(description).then(function () { - _this.storeTask(key, t); - console.log((0, _output.outputVertical)('Task:', key, _constants.STARTED, (0, _moment2.default)().toISOString())); - }, _output.cliError).catch(_output.cliError); - } - }, { - key: 'pauseTask', - value: function pauseTask(key) { - var _this2 = this; - - var t = this.getTask(key); - t.pause().then(function () { - _this2.storeTask(key, t); - console.log((0, _output.outputVertical)('Task:', key, _constants.PAUSED, (0, _moment2.default)().toISOString())); - }, _output.cliError).catch(_output.cliError); - } - }, { - key: 'unpauseTask', - value: function unpauseTask(key) { - var _this3 = this; - - var t = this.getTask(key); - t.unpause().then(function () { - _this3.storeTask(key, t); - console.log((0, _output.outputVertical)('Task:', key, _constants.UNPAUSED, (0, _moment2.default)().toISOString())); - }, _output.cliError).catch(_output.cliError); - } - }, { - key: 'stopTask', - value: function stopTask(key, description) { - var _this4 = this; - - var t = this.getTask(key); - t.stop(description).then(function () { - _this4.storeTask(key, t); - console.log((0, _output.outputVertical)('Task:', key, _constants.FINISHED, (0, _moment2.default)().toISOString())); - }, _output.cliError).catch(_output.cliError); - } - }, { - key: 'addDescription', - value: function addDescription(key, text) { - var t = this.getTask(key); - t.setDescription(text); - this.storeTask(key, t); - } - }, { - key: 'getTime', - value: function getTime(name) { - var t = this.getTask(name); - return t.getSeconds(); - } - }, { - key: 'modifyTask', - value: function modifyTask(operation, name, stringTime) { - var _this5 = this; - - var t = this.getTask(name); - t.makeOperationOverTime(operation, stringTime).then(function () { - _this5.storeTask(name, t); - }, _output.cliError).catch(_output.cliError); - } - }, { - key: 'search', - value: function search(string) { - var _this6 = this; - - var keys = Object.keys(this.tasks); - var tasks = []; - keys.forEach(function (key) { - if (string === 'all' || key.indexOf(string) > -1) { - tasks.push({ - name: key, - task: new _Task2.default(_this6.tasks[key]) - }); - } - }); - return tasks; - } - }, { - key: 'delete', - value: function _delete(string) { - var _this7 = this; - - var tasks = this.search(string); - - console.log(tasks.map(function (k) { - return k.name + ' \n'; - }).join('')); - - if (tasks.length === 0) { - (0, _output.cliSuccess)('No tasks found to delete.'); - return; - } - - _inquirer2.default.prompt([{ - type: 'confirm', - name: 'cls', - message: 'Are you sure you want to delete this tasks?', - default: false - }]).then(function (answers) { - if (answers.cls) { - tasks.forEach(function (k) { - delete _this7.tasks[k.name]; - _this7.cfg.set('tasks', _this7.tasks); - }); - (0, _output.cliSuccess)('Tasks deleted.'); - } - }).catch(_output.cliError); - } - }, { - key: 'getTasksJson', - value: function getTasksJson() { - return _flat2.default.unflatten(this.tasks); - } - }, { - key: 'getConfig', - value: function getConfig() { - return this.config; - } - }, { - 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() + ' '); - } - - var newCfg = _defineProperty({}, element, value); - - this.config = Object.assign({}, this.config, newCfg); - this.cfg.set('config', this.config); - - return this.config; - } - }, { - key: 'update', - value: function update() { - var _this8 = this; - - if (!this.config || this.config && this.config['config.version'] !== '2') { - console.log('DB: Need to be updated'); - - (0, _dbMigrations.migrateToV2)(this.tasks).then(function (tasks) { - var newTasks = {}; - tasks.forEach(function (t) { - return newTasks[t.key] = t.task; - }); - return newTasks; - }).then(function (migratedTasks) { - _this8.cfg.set('tasks', migratedTasks); - _this8.cfg.set('config', Object.assign(_this8.config, { - 'config.version': '2' - })); - - (0, _output.cliSuccess)('Configuration migrated to version 2.'); - }, _output.cliError).catch(_output.cliError); - } else { - (0, _output.cliSuccess)('No need to update the DB.'); - } - } - }, { - key: 'sumarize', - value: function sumarize(key, rate) { - var full = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; - - var tasks = this.search(key); - (0, _output.sumarize)(key, tasks, rate, full, this.config['format.output']); - } - }]); - - return Manager; + function Manager(cfg) { + _classCallCheck(this, Manager); + + this.repositories = ['tasks', 'config']; + + this.cfg = cfg; + this.tasks = cfg.all.tasks; + this.config = cfg.all.config ? cfg.all.config : {}; + } + + _createClass(Manager, [{ + key: 'getTask', + value: function getTask(key) { + var task = this.tasks[key] ? this.tasks[key] : null; + return new _Task2.default(task); + } + }, { + key: 'getAllTasks', + value: function getAllTasks(props) { + var _this = this; + + var myTasks = []; + if (!props) props = {}; + Object.keys(this.tasks).forEach(function (key) { + if (props.filter) { + var _st = _this.tasks[key].status; + if (props.filter === 'unfinished') { + if (_st === _constants.FINISHED) return; + } else if (props.filter === 'running') { + if (_st === _constants.FINISHED || _st === _constants.PAUSED) return; + } else if (props.filter === 'paused') { + if (_st !== _constants.PAUSED) return; + } + } + if (props.only_key) { + myTasks.push(key); + return; + } + var _task = { key: key }; + if (props.status) _task.status = _this.tasks[key].status; + if (props.lastLog) _task.lastLog = _this.tasks[key].log[_this.tasks[key].log.length - 1]; + myTasks.push(_task); + }); + return myTasks; + } + }, { + key: 'storeTask', + value: function storeTask(key, task) { + var update = {}; + update[key] = task.get(); + this.tasks = Object.assign({}, this.tasks, update); + this.cfg.set('tasks', this.tasks); + } + }, { + key: 'startTask', + value: function startTask(key, description) { + var _this2 = this; + + var t = this.getTask(key); + t.start(description).then(function () { + _this2.storeTask(key, t); + console.log((0, _output.outputVertical)('Task:', key, _constants.STARTED, (0, _moment2.default)().toISOString())); + }, _output.cliError).catch(_output.cliError); + } + }, { + key: 'pauseTasks', + value: function pauseTasks(key) { + var _this3 = this; + + if (key) { + this.pauseTask(key); + return; + } + var running_tasks = this.getAllTasks({ filter: 'running', only_key: true }); + running_tasks.forEach(function (el) { + return _this3.pauseTask(el); + }); + console.log('Pausing', running_tasks.length, 'Task(s)'); + } + }, { + key: 'pauseTask', + value: function pauseTask(key) { + var _this4 = this; + + var t = this.getTask(key); + t.pause().then(function () { + _this4.storeTask(key, t); + console.log((0, _output.outputVertical)('Task:', key, _constants.PAUSED, (0, _moment2.default)().toISOString())); + }, _output.cliError).catch(_output.cliError); + } + }, { + key: 'unpauseTasks', + value: function unpauseTasks(key) { + var _this5 = this; + + if (key) { + this.unpauseTask(key); + return; + } + var paused_tasks = this.getAllTasks({ filter: 'paused', only_key: true }); + paused_tasks.forEach(function (el) { + return _this5.unpauseTask(el); + }); + console.log('Unpausing', paused_tasks.length, 'Task(s)'); + } + }, { + key: 'unpauseTask', + value: function unpauseTask(key) { + var _this6 = this; + + var t = this.getTask(key); + t.unpause().then(function () { + _this6.storeTask(key, t); + console.log((0, _output.outputVertical)('Task:', key, _constants.UNPAUSED, (0, _moment2.default)().toISOString())); + }, _output.cliError).catch(_output.cliError); + } + }, { + key: 'stopTask', + value: function stopTask(key, description) { + var _this7 = this; + + var t = this.getTask(key); + t.stop(description).then(function () { + _this7.storeTask(key, t); + console.log((0, _output.outputVertical)('Task:', key, _constants.FINISHED, (0, _moment2.default)().toISOString())); + }, _output.cliError).catch(_output.cliError); + } + }, { + key: 'addDescription', + value: function addDescription(key, text) { + var t = this.getTask(key); + t.setDescription(text); + this.storeTask(key, t); + } + }, { + key: 'getTime', + value: function getTime(name) { + var t = this.getTask(name); + return t.getSeconds(); + } + }, { + key: 'modifyTask', + value: function modifyTask(operation, name, stringTime) { + var _this8 = this; + + var t = this.getTask(name); + t.makeOperationOverTime(operation, stringTime).then(function () { + _this8.storeTask(name, t); + }, _output.cliError).catch(_output.cliError); + } + }, { + key: 'search', + value: function search(string) { + var _this9 = this; + + var keys = Object.keys(this.tasks); + var tasks = []; + keys.forEach(function (key) { + if (string === 'all' || key.indexOf(string) > -1) { + tasks.push({ + name: key, + task: new _Task2.default(_this9.tasks[key]) + }); + } + }); + return tasks; + } + }, { + key: 'delete', + value: function _delete(string) { + var _this10 = this; + + var tasks = this.search(string); + console.log(tasks.map(function (k) { + return k.name + ' \n'; + }).join('')); + if (tasks.length === 0) { + (0, _output.cliSuccess)('No tasks found to delete.'); + return; + } + _inquirer2.default.prompt([{ + type: 'confirm', + name: 'cls', + message: 'Are you sure you want to delete this tasks?', + default: false + }]).then(function (answers) { + if (answers.cls) { + tasks.forEach(function (k) { + delete _this10.tasks[k.name]; + _this10.cfg.set('tasks', _this10.tasks); + }); + (0, _output.cliSuccess)('Tasks deleted.'); + } + }).catch(_output.cliError); + } + }, { + key: 'getTasksJson', + value: function getTasksJson() { + return _flat2.default.unflatten(this.tasks); + } + }, { + key: 'getConfig', + value: function getConfig() { + return this.config; + } + }, { + 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() + ' '); + var newCfg = _defineProperty({}, element, value); + this.config = Object.assign({}, this.config, newCfg); + this.cfg.set('config', this.config); + return this.config; + } + }, { + key: 'update', + value: function update() { + var _this11 = this; + + if (!this.config || this.config && this.config['config.version'] !== '2') { + console.log('DB: Need to be updated'); + (0, _dbMigrations.migrateToV2)(this.tasks).then(function (tasks) { + var newTasks = {}; + tasks.forEach(function (t) { + return newTasks[t.key] = t.task; + }); + return newTasks; + }).then(function (migratedTasks) { + _this11.cfg.set('tasks', migratedTasks); + _this11.cfg.set('config', Object.assign(_this11.config, { + 'config.version': '2' + })); + (0, _output.cliSuccess)('Configuration migrated to version 2.'); + }, _output.cliError).catch(_output.cliError); + } else { + (0, _output.cliSuccess)('No need to update the DB.'); + } + } + }, { + key: 'summarize', + value: function summarize(args) { + if (typeof args.full === 'undefined') args.full = true; + (0, _output.summarize)({ + search: args.key, + tasks: this.search(args.key), + rate: args.rate, + full: args.full, + timespan: args.timespan, + format: this.config['format.output'] + }); + } + }, { + key: 'getStatus', + value: function getStatus() { + var keys = this.getAllTasks({ view: 'list', status: true, lastLog: true }); + keys.forEach(function (el) { + console.log(el.key, el.status, el.lastLog); + }); + } + }]); + + return Manager; }(); exports.default = Manager; diff --git a/lib/core/Manager.js.map b/lib/core/Manager.js.map index 82f745f..6a513f8 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","element","value","configElements","toString","newCfg","newTasks","migratedTasks","rate","full"],"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() {\n return flat.unflatten(this.tasks)\n }\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 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","props","myTasks","Object","keys","forEach","filter","_st","status","only_key","push","_task","lastLog","log","length","update","get","assign","set","description","t","getTask","start","then","storeTask","console","toISOString","catch","pauseTask","running_tasks","getAllTasks","el","pause","unpauseTask","paused_tasks","unpause","stop","text","setDescription","name","getSeconds","operation","stringTime","makeOperationOverTime","string","indexOf","search","map","k","join","prompt","type","message","default","answers","cls","unflatten","element","value","configElements","toString","newCfg","newTasks","migratedTasks","args","full","rate","timespan","format","view"],"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 {summarize, outputVertical, cliError, cliSuccess} from './output'\nimport {migrateToV2} from './dbMigrations'\n\nexport default class Manager {\n\n\trepositories = ['tasks', 'config']\n\n\tconstructor(cfg) {\n\t\tthis.cfg = cfg\n\t\tthis.tasks = cfg.all.tasks\n\t\tthis.config = (cfg.all.config) ? cfg.all.config : {}\n\t}\n\n\tgetTask(key) {\n\t\tlet task = (this.tasks[key]) ? this.tasks[key] : null\n\t\treturn new Task(task)\n\t}\n\n\tgetAllTasks(props) {\n\t\tlet myTasks = []\n\t\tif (!props) props = {}\n\t\tObject.keys(this.tasks).forEach(key => {\n\t\t\tif (props.filter) {\n\t\t\t\tlet _st = this.tasks[key].status\n\t\t\t\tif (props.filter === 'unfinished') {\n\t\t\t\t\tif (_st === FINISHED)\n\t\t\t\t\t\treturn\n\t\t\t\t} else if (props.filter === 'running') {\n\t\t\t\t\tif (_st === FINISHED || _st === PAUSED)\n\t\t\t\t\t\treturn\n\t\t\t\t} else if (props.filter === 'paused') {\n\t\t\t\t\tif (_st !== PAUSED)\n\t\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (props.only_key) {\n\t\t\t\tmyTasks.push(key)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tlet _task = {key: key}\n\t\t\tif (props.status)\n\t\t\t\t_task.status = this.tasks[key].status\n\t\t\tif (props.lastLog)\n\t\t\t\t_task.lastLog = this.tasks[key].log[this.tasks[key].log.length - 1]\n\t\t\tmyTasks.push(_task)\n\t\t})\n\t\treturn myTasks\n\t}\n\n\tstoreTask(key, task) {\n\t\tlet update = {}\n\t\tupdate[key] = task.get()\n\t\tthis.tasks = Object.assign({}, this.tasks, update)\n\t\tthis.cfg.set('tasks', this.tasks)\n\t}\n\n\tstartTask(key, description) {\n\t\tlet t = this.getTask(key)\n\t\tt.start(description)\n\t\t\t.then(() => {\n\t\t\t\tthis.storeTask(key, t)\n\t\t\t\tconsole.log(\n\t\t\t\t\toutputVertical('Task:', key, STARTED, moment().toISOString())\n\t\t\t\t)\n\t\t\t}, cliError)\n\t\t\t.catch(cliError)\n\t}\n\n\tpauseTasks(key) {\n\t\tif (key) {\n\t\t\tthis.pauseTask(key)\n\t\t\treturn\n\t\t}\n\t\tlet running_tasks = this.getAllTasks({filter: 'running', only_key: true})\n\t\trunning_tasks.forEach(el => this.pauseTask(el))\n\t\tconsole.log('Pausing', running_tasks.length, 'Task(s)')\n\t}\n\n\tpauseTask(key) {\n\t\tlet t = this.getTask(key)\n\t\tt.pause()\n\t\t\t.then(()=>{\n\t\t\t\tthis.storeTask(key, t)\n\t\t\t\tconsole.log(\n\t\t\t\t\toutputVertical('Task:', key, PAUSED, moment().toISOString())\n\t\t\t\t)\n\t\t\t}, cliError)\n\t\t\t.catch(cliError)\n\t}\n\n\tunpauseTasks(key) {\n\t\tif (key) {\n\t\t\tthis.unpauseTask(key)\n\t\t\treturn\n\t\t}\n\t\tlet paused_tasks = this.getAllTasks({filter: 'paused', only_key: true})\n\t\tpaused_tasks.forEach(el => this.unpauseTask(el))\n\t\tconsole.log('Unpausing', paused_tasks.length, 'Task(s)')\n\t}\n\n\tunpauseTask(key) {\n\t\tlet t = this.getTask(key)\n\t\tt.unpause()\n\t\t\t.then(()=>{\n\t\t\t\tthis.storeTask(key, t)\n\t\t\t\tconsole.log(\n\t\t\t\t\toutputVertical('Task:', key, UNPAUSED, moment().toISOString())\n\t\t\t\t)\n\t\t\t}, cliError)\n\t\t\t.catch(cliError)\n\t}\n\n\tstopTask(key, description) {\n\t\tlet t = this.getTask(key)\n\t\tt.stop(description)\n\t\t\t.then(()=>{\n\t\t\t\tthis.storeTask(key, t)\n\t\t\t\tconsole.log(\n\t\t\t\t\toutputVertical('Task:', key, FINISHED, moment().toISOString())\n\t\t\t\t)\n\t\t\t}, cliError)\n\t\t\t.catch(cliError)\n\t}\n\n\taddDescription(key, text) {\n\t\tlet t = this.getTask(key)\n\t\tt.setDescription(text)\n\t\tthis.storeTask(key, t)\n\t}\n\n\tgetTime(name) {\n\t\tlet t = this.getTask(name)\n\t\treturn t.getSeconds()\n\t}\n\n\tmodifyTask(operation, name, stringTime) {\n\t\tlet t = this.getTask(name)\n\t\tt.makeOperationOverTime(operation, stringTime)\n\t\t\t.then(()=>{\n\t\t\t\tthis.storeTask(name, t)\n\t\t\t}, cliError)\n\t\t\t.catch(cliError)\n\t}\n\n\tsearch(string) {\n\t\tlet keys = Object.keys(this.tasks)\n\t\tlet tasks = []\n\t\tkeys.forEach((key)=>{\n\t\t\tif (string === 'all' || key.indexOf(string) > -1){\n\t\t\t\ttasks.push({\n\t\t\t\t\tname: key,\n\t\t\t\t\ttask: new Task(this.tasks[key])\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\treturn tasks\n\t}\n\n\tdelete(string) {\n\t\tlet tasks = this.search(string)\n\t\tconsole.log(tasks.map(k => `${k.name} \\n`).join(''))\n\t\tif (tasks.length === 0) {\n\t\t\tcliSuccess('No tasks found to delete.')\n\t\t\treturn\n\t\t}\n\t\tinquirer.prompt([{\n\t\t\ttype: 'confirm',\n\t\t\tname: 'cls',\n\t\t\tmessage: `Are you sure you want to delete this tasks?`,\n\t\t\tdefault: false\n\t\t}]).then((answers) => {\n\t\t\tif (answers.cls){\n\t\t\t\ttasks.forEach(k => {\n\t\t\t\t\tdelete this.tasks[k.name]\n\t\t\t\t\tthis.cfg.set('tasks', this.tasks)\n\t\t\t\t})\n\t\t\t\tcliSuccess('Tasks deleted.')\n\t\t\t}\n\t\t})\n\t\t.catch(cliError)\n\t}\n\n\tgetTasksJson() {\n\t\treturn flat.unflatten(this.tasks)\n\t}\n\n\tgetConfig() {\n\t\treturn this.config\n\t}\n\n\tconfigure(element, value) {\n\t\tif (configElements.indexOf(element) < 0)\n\t\t\treturn cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `)\n\t\tlet newCfg = {[element]: value}\n\t\tthis.config = Object.assign({}, this.config, newCfg)\n\t\tthis.cfg.set('config', this.config)\n\t\treturn this.config\n\t}\n\n\tupdate() {\n\t\tif (!this.config || (this.config && this.config['config.version'] !== '2') ) {\n\t\t\tconsole.log('DB: Need to be updated')\n\t\t\tmigrateToV2(this.tasks)\n\t\t\t\t.then(tasks => {\n\t\t\t\t\tlet newTasks = {}\n\t\t\t\t\ttasks.forEach(t => newTasks[t.key] = t.task)\n\t\t\t\t\treturn newTasks\n\t\t\t\t})\n\t\t\t\t.then(migratedTasks => {\n\t\t\t\t\tthis.cfg.set('tasks', migratedTasks)\n\t\t\t\t\tthis.cfg.set('config', Object.assign(this.config, {\n\t\t\t\t\t\t'config.version': '2'\n\t\t\t\t\t}))\n\t\t\t\t\tcliSuccess('Configuration migrated to version 2.')\n\t\t\t\t}, cliError)\n\t\t\t\t.catch(cliError)\n\t\t} else {\n\t\t\tcliSuccess('No need to update the DB.')\n\t\t}\n\t}\n\n\tsummarize(args) {\n\t\tif (typeof args.full === 'undefined') args.full = true\n\t\tsummarize({\n\t\t\tsearch: args.key,\n\t\t\ttasks: this.search(args.key),\n\t\t\trate: args.rate,\n\t\t\tfull: args.full,\n\t\t\ttimespan: args.timespan,\n\t\t\tformat: this.config['format.output']\n\t\t})\n\t}\n\n\tgetStatus() {\n\t\tlet keys = this.getAllTasks({view: 'list', status: true, lastLog: true})\n\t\tkeys.forEach(el => {\n\t\t\tconsole.log(el.key, el.status, el.lastLog)\n\t\t})\n\t}\n\n}\n"]} \ No newline at end of file diff --git a/lib/core/Task.js b/lib/core/Task.js index 4c1680b..fd2a376 100644 --- a/lib/core/Task.js +++ b/lib/core/Task.js @@ -1,7 +1,7 @@ 'use strict'; Object.defineProperty(exports, "__esModule", { - value: true + value: true }); exports.default = undefined; @@ -22,212 +22,169 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Task = function () { - function Task(task) { - _classCallCheck(this, Task); - - this.task = task ? task : { - description: '', - timings: [] - }; - } - - _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]; - if (!timing) { - throw 'This task is not started, start it.'; - } - - var newStop = (0, _moment2.default)(timing.stop); - newStop = newStop[operation](time.value, time.momentKey); - - if (operation === 'subtract' && newStop.isBefore(timing.start)) { - throw 'You cant subtract more time'; - return; - } - - this.task.timings[this.task.timings.length - 1].stop = newStop; - } - }, { - key: 'start', - value: function start(description) { - var _this = this; - - return new Promise(function (resolve, reject) { - var started = false; - - var timing = _this.task.timings[_this.task.timings.length - 1]; - - if (timing && timing.start && !timing.stop) { - reject(_this.error('This task already started.')); - } - - _this.task.timings.push({ - start: (0, _moment2.default)().toDate() - }); - - _this.setDescription(description); - _this.setStatus(_constants.IN_PROGRESS); - _this.log('start'); - resolve(); - }); - } - }, { - key: 'pause', - value: function pause() { - var _this2 = this; - - return new Promise(function (resolve, reject) { - var timing = _this2.task.timings[_this2.task.timings.length - 1]; - - if (!timing) { - reject(_this2.error('This task is not started, start it.')); - } - - if (timing && timing.start && timing.stop) { - reject(_this2.error('This task are ended/paused, unpaused it.')); - } - - _this2.task.timings[_this2.task.timings.length - 1].stop = (0, _moment2.default)().toDate(); - _this2.setStatus(_constants.PAUSED); - _this2.log('pause'); - resolve(); - }); - } - }, { - key: 'unpause', - value: function unpause() { - var _this3 = this; - - return new Promise(function (resolve, reject) { - var timing = _this3.task.timings[_this3.task.timings.length - 1]; - if (!timing) { - reject(_this3.error('This task is not started, start it')); - } - - if (timing && timing.start && !timing.stop) { - reject(_this3.error('This task is started, pause/stop first')); - } - - _this3.task.timings.push({ - start: (0, _moment2.default)().toDate() - }); - _this3.setStatus(_constants.IN_PROGRESS); - _this3.log('unpause'); - resolve(); - }); - } - }, { - key: 'stop', - value: function stop(description) { - var _this4 = this; - - return new Promise(function (resolve, reject) { - var timing = _this4.task.timings[_this4.task.timings.length - 1]; - if (!timing || timing && !timing.start) { - reject(_this4.error('This task is not started, start it')); - } - - if (timing.start && timing.stop) { - reject(_this4.error('This task already ended, start/unpause it.')); - } - - _this4.task.timings[_this4.task.timings.length - 1].stop = (0, _moment2.default)().toDate(); - _this4.setDescription(description); - _this4.setStatus(_constants.FINISHED); - _this4.log('stop'); - resolve(); - }); - } - }, { - key: 'log', - value: function log(operation) { - if (!this.task.log) { - this.task.log = []; - } - - this.task.log.push(operation + '#' + (0, _moment2.default)().toISOString()); - } - }, { - key: 'setDescription', - value: function setDescription(text) { - this.task.description = text ? text : this.task.description ? this.task.description : ''; - } - }, { - key: 'setStatus', - value: function setStatus(status) { - this.task.status = status; - } - }, { - key: 'makeOperationOverTime', - value: function makeOperationOverTime(operation, stringTime) { - var _this5 = this; - - return new Promise(function (resolve, reject) { - var parsed = (0, _Utils.recognizeModifierTiming)(stringTime); - - try { - parsed.map(function (t) { - _this5._modifyTiming(t, operation); - }); - } catch (err) { - console.error(err); - reject(_this5.error('Error trying to ' + operation + ' time to task')); - } - _this5.log(operation + ':' + stringTime); - - resolve(); - }); - } - }, { - key: 'get', - value: function get() { - return this.task; - } - }, { - 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); - }); - } else { - duration = this._calcTime(this.task); - } - - return duration; - } - }, { - key: 'getStartDate', - value: function getStartDate() { - if (this.task.timings) { - return this.task.timings[0].start; - } else { - return this.task.start; - } - } - }, { - key: 'error', - value: function error(err) { - return err; //+ ` \n Task: ${JSON.stringify(this.task)}` - } - }]); - - return Task; + function Task(task) { + _classCallCheck(this, Task); + + this.task = task ? task : { + description: '', + timings: [] + }; + } + + _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]; + if (!timing) { + throw 'This task is not started, start it.'; + } + var newStop = (0, _moment2.default)(timing.stop); + newStop = newStop[operation](time.value, time.momentKey); + if (operation === 'subtract' && newStop.isBefore(timing.start)) { + throw 'You cant subtract more time'; + return; + } + this.task.timings[this.task.timings.length - 1].stop = newStop; + } + }, { + key: 'start', + value: function start(description) { + var _this = this; + + return new Promise(function (resolve, reject) { + var started = false; + var timing = _this.task.timings[_this.task.timings.length - 1]; + if (timing && timing.start && !timing.stop) reject(_this.error('This task already started.')); + _this.task.timings.push({ start: (0, _moment2.default)().toDate() }); + _this.setDescription(description); + _this.setStatus(_constants.IN_PROGRESS); + _this.log('start'); + resolve(); + }); + } + }, { + key: 'pause', + value: function pause() { + var _this2 = this; + + return new Promise(function (resolve, reject) { + var timing = _this2.task.timings[_this2.task.timings.length - 1]; + if (!timing) reject(_this2.error('This task is not started, start it.')); + if (timing && timing.start && timing.stop) reject(_this2.error('This task are ended/paused, unpaused it.')); + _this2.task.timings[_this2.task.timings.length - 1].stop = (0, _moment2.default)().toDate(); + _this2.setStatus(_constants.PAUSED); + _this2.log('pause'); + resolve(); + }); + } + }, { + key: 'unpause', + value: function unpause() { + var _this3 = this; + + return new Promise(function (resolve, reject) { + var timing = _this3.task.timings[_this3.task.timings.length - 1]; + if (!timing) reject(_this3.error('This task is not started, start it')); + if (timing && timing.start && !timing.stop) reject(_this3.error('This task is started, pause/stop first')); + _this3.task.timings.push({ start: (0, _moment2.default)().toDate() }); + _this3.setStatus(_constants.IN_PROGRESS); + _this3.log('unpause'); + resolve(); + }); + } + }, { + key: 'stop', + value: function stop(description) { + var _this4 = this; + + return new Promise(function (resolve, reject) { + var timing = _this4.task.timings[_this4.task.timings.length - 1]; + if (!timing || timing && !timing.start) reject(_this4.error('This task is not started, start it')); + if (timing.start && timing.stop) reject(_this4.error('This task already ended, start/unpause it.')); + _this4.task.timings[_this4.task.timings.length - 1].stop = (0, _moment2.default)().toDate(); + _this4.setDescription(description); + _this4.setStatus(_constants.FINISHED); + _this4.log('stop'); + resolve(); + }); + } + }, { + key: 'log', + value: function log(operation) { + if (!this.task.log) this.task.log = []; + this.task.log.push(operation + '#' + (0, _moment2.default)().toISOString()); + } + }, { + key: 'setDescription', + value: function setDescription(text) { + this.task.description = text ? text : this.task.description ? this.task.description : ''; + } + }, { + key: 'setStatus', + value: function setStatus(status) { + this.task.status = status; + } + }, { + key: 'makeOperationOverTime', + value: function makeOperationOverTime(operation, stringTime) { + var _this5 = this; + + return new Promise(function (resolve, reject) { + var parsed = (0, _Utils.recognizeModifierTiming)(stringTime); + try { + parsed.map(function (t) { + _this5._modifyTiming(t, operation); + }); + } catch (err) { + console.error(err); + reject(_this5.error('Error trying to ' + operation + ' time to task')); + } + _this5.log(operation + ':' + stringTime); + resolve(); + }); + } + }, { + key: 'get', + value: function get() { + return this.task; + } + }, { + 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); + }); + } else { + duration = this._calcTime(this.task); + } + return duration; + } + }, { + key: 'getStartDate', + value: function getStartDate() { + if (this.task.timings) { + return this.task.timings[0].start; + } else { + return this.task.start; + } + } + }, { + key: 'error', + value: function error(err) { + return err; //+ ` \n Task: ${JSON.stringify(this.task)}` + } + }]); + + return Task; }(); exports.default = Task; diff --git a/lib/core/Task.js.map b/lib/core/Task.js.map index 4aae470..5c20ad2 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 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){\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","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'\nimport {STARTED, PAUSED, IN_PROGRESS, FINISHED} from './constants'\nimport {recognizeModifierTiming} from './Utils'\nimport {cliError} from './output'\n\nexport default class Task {\n\tconstructor(task){\n\t\tthis.task = (task) ? task : {\n\t\t\tdescription: '',\n\t\t\ttimings: []\n\t\t}\n\t}\n\n\t_calcTime(t) {\n\t\tif (t.stop)\n\t\t\treturn moment(t.stop).diff(moment(t.start), 'seconds')\n\t\telse\n\t\t\treturn moment().diff(moment(t.start), 'seconds')\n\t}\n\n\t_modifyTiming(time, operation) {\n\t\tlet timing = this.task.timings[this.task.timings.length - 1]\n\t\tif (!timing) {\n\t\t\tthrow (`This task is not started, start it.`)\n\t\t}\n\t\tlet newStop = moment(timing.stop)\n\t\tnewStop = newStop[operation](time.value, time.momentKey)\n\t\tif (operation === 'subtract' && newStop.isBefore(timing.start)){\n\t\t\tthrow('You cant subtract more time')\n\t\t\treturn\n\t\t}\n\t\tthis.task.timings[this.task.timings.length - 1].stop = newStop\n\t}\n\n\tstart(description) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet started = false\n\t\t\tlet timing = this.task.timings[this.task.timings.length - 1]\n\t\t\tif (timing && timing.start && !timing.stop)\n\t\t\t\treject(this.error(`This task already started.`))\n\t\t\tthis.task.timings.push({start: moment().toDate()})\n\t\t\tthis.setDescription(description)\n\t\t\tthis.setStatus(IN_PROGRESS)\n\t\t\tthis.log('start')\n\t\t\tresolve()\n\t\t})\n\t}\n\n\tpause() {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet timing = this.task.timings[this.task.timings.length - 1]\n\t\t\tif (!timing)\n\t\t\t\treject(this.error(`This task is not started, start it.`))\n\t\t\tif (timing && timing.start && timing.stop)\n\t\t\t\treject(this.error(`This task are ended/paused, unpaused it.`))\n\t\t\tthis.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n\t\t\tthis.setStatus(PAUSED)\n\t\t\tthis.log('pause')\n\t\t\tresolve()\n\t\t})\n\t}\n\n\tunpause() {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet timing = this.task.timings[this.task.timings.length - 1]\n\t\t\tif (!timing)\n\t\t\t\treject(this.error(`This task is not started, start it`))\n\t\t\tif (timing && timing.start && !timing.stop)\n\t\t\t\treject(this.error(`This task is started, pause/stop first`))\n\t\t\tthis.task.timings.push({start: moment().toDate()})\n\t\t\tthis.setStatus(IN_PROGRESS)\n\t\t\tthis.log('unpause')\n\t\t\tresolve()\n\t\t})\n\t}\n\n\tstop(description) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet timing = this.task.timings[this.task.timings.length - 1]\n\t\t\tif (!timing || timing && !timing.start)\n\t\t\t\treject(this.error(`This task is not started, start it`))\n\t\t\tif (timing.start && timing.stop)\n\t\t\t\treject(this.error(`This task already ended, start/unpause it.`))\n\t\t\tthis.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n\t\t\tthis.setDescription(description)\n\t\t\tthis.setStatus(FINISHED)\n\t\t\tthis.log('stop')\n\t\t\tresolve()\n\t\t})\n\t}\n\n\tlog(operation) {\n\t\tif (!this.task.log)\n\t\t\tthis.task.log = []\n\t\tthis.task.log.push(`${operation}#${moment().toISOString()}`)\n\t}\n\n\tsetDescription(text) {\n\t\tthis.task.description = (text) ? text : (this.task.description) ? this.task.description : ''\n\t}\n\n\tsetStatus(status) {\n\t\tthis.task.status = status\n\t}\n\n\tmakeOperationOverTime(operation, stringTime) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet parsed = recognizeModifierTiming(stringTime)\n\t\t\ttry {\n\t\t\t\tparsed.map((t) => {\n\t\t\t\t\tthis._modifyTiming(t, operation)\n\t\t\t\t})\n\t\t\t} catch(err) {\n\t\t\t\tconsole.error(err)\n\t\t\t\treject(this.error(`Error trying to ${operation} time to task`))\n\t\t\t}\n\t\t\tthis.log(`${operation}:${stringTime}`)\n\t\t\tresolve()\n\t\t})\n\t}\n\n\tget() {\n\t\treturn this.task\n\t}\n\n\tgetSeconds() {\n\t\tlet duration = 0\n\t\tif (this.task.timings) {\n\t\t\tthis.task.timings.forEach(timing => {\n\t\t\t\tduration += this._calcTime(timing)\n\t\t\t})\n\t\t} else {\n\t\t\tduration = this._calcTime(this.task)\n\t\t}\n\t\treturn duration\n\t}\n\n\tgetStartDate() {\n\t\tif (this.task.timings){\n\t\t\treturn this.task.timings[0].start\n\t\t} else {\n\t\t\treturn this.task.start\n\t\t}\n\t}\n\n\terror(err) {\n\t\treturn err //+ ` \\n Task: ${JSON.stringify(this.task)}`\n\t}\n}\n"]} \ No newline at end of file diff --git a/lib/core/dbMigrations.js b/lib/core/dbMigrations.js index c511734..5291e0b 100644 --- a/lib/core/dbMigrations.js +++ b/lib/core/dbMigrations.js @@ -1,42 +1,40 @@ "use strict"; Object.defineProperty(exports, "__esModule", { - value: true + value: true }); var migrateToV2 = exports.migrateToV2 = function migrateToV2(tasks) { - var promises = []; - var migrate = function migrate(key, task) { - return new Promise(function (resolve, reject) { - - var timing = {}; - var update = false; - - if (task.start) { - update = true; - timing.start = task.start; - delete task.start; - } - - if (task.stop) { - timing.stop = task.stop; - delete task.stop; - } - - if (update) { - task.timings = [timing]; - } - - resolve({ - key: key, - task: task - }); - }); - }; - - Object.keys(tasks).forEach(function (k) { - return promises.push(migrate(k, tasks[k])); - }); - - return Promise.all(promises); + var promises = []; + var migrate = function migrate(key, task) { + return new Promise(function (resolve, reject) { + var timing = {}; + var update = false; + + if (task.start) { + update = true; + timing.start = task.start; + delete task.start; + } + + if (task.stop) { + timing.stop = task.stop; + delete task.stop; + } + + if (update) { + task.timings = [timing]; + } + + resolve({ + key: key, + task: task + }); + }); + }; + + Object.keys(tasks).forEach(function (k) { + return promises.push(migrate(k, tasks[k])); + }); + return Promise.all(promises); }; //# sourceMappingURL=dbMigrations.js.map \ No newline at end of file diff --git a/lib/core/dbMigrations.js.map b/lib/core/dbMigrations.js.map index 354b01a..b4e6b9a 100644 --- a/lib/core/dbMigrations.js.map +++ b/lib/core/dbMigrations.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/dbMigrations.js"],"names":["migrateToV2","tasks","promises","migrate","key","task","Promise","resolve","reject","timing","update","start","stop","timings","Object","keys","forEach","push","k","all"],"mappings":";;;;;AAAO,IAAMA,oCAAc,SAAdA,WAAc,CAAUC,KAAV,EAAgB;AACvC,QAAIC,WAAW,EAAf;AACA,QAAIC,UAAU,SAAVA,OAAU,CAACC,GAAD,EAAMC,IAAN;AAAA,eAAe,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;;AAE1D,gBAAIC,SAAS,EAAb;AACA,gBAAIC,SAAS,KAAb;;AAEA,gBAAIL,KAAKM,KAAT,EAAgB;AACZD,yBAAS,IAAT;AACAD,uBAAOE,KAAP,GAAeN,KAAKM,KAApB;AACA,uBAAON,KAAKM,KAAZ;AACH;;AAED,gBAAIN,KAAKO,IAAT,EAAe;AACXH,uBAAOG,IAAP,GAAcP,KAAKO,IAAnB;AACA,uBAAOP,KAAKO,IAAZ;AACH;;AAED,gBAAIF,MAAJ,EAAY;AACRL,qBAAKQ,OAAL,GAAe,CAACJ,MAAD,CAAf;AACH;;AAEDF,oBAAQ;AACJH,wBADI;AAEJC;AAFI,aAAR;AAIH,SAxB4B,CAAf;AAAA,KAAd;;AA0BAS,WAAOC,IAAP,CAAYd,KAAZ,EAAmBe,OAAnB,CAA2B;AAAA,eAAKd,SAASe,IAAT,CAAed,QAAQe,CAAR,EAAWjB,MAAMiB,CAAN,CAAX,CAAf,CAAL;AAAA,KAA3B;;AAEA,WAAOZ,QAAQa,GAAR,CAAYjB,QAAZ,CAAP;AACH,CA/BM","file":"dbMigrations.js","sourcesContent":["export const migrateToV2 = function (tasks){\n let promises = []\n let migrate = (key, task) => new Promise((resolve, reject) => {\n\n let timing = {}\n let update = false\n\n if (task.start) {\n update = true\n timing.start = task.start\n delete task.start\n }\n\n if (task.stop) {\n timing.stop = task.stop\n delete task.stop\n }\n\n if (update) {\n task.timings = [timing]\n }\n\n resolve({\n key,\n task\n })\n })\n\n Object.keys(tasks).forEach(k => promises.push( migrate(k, tasks[k]) ))\n\n return Promise.all(promises)\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/dbMigrations.js"],"names":["migrateToV2","tasks","promises","migrate","key","task","Promise","resolve","reject","timing","update","start","stop","timings","Object","keys","forEach","push","k","all"],"mappings":";;;;;AAAO,IAAMA,oCAAc,SAAdA,WAAc,CAAUC,KAAV,EAAiB;AAC3C,KAAIC,WAAW,EAAf;AACA,KAAIC,UAAU,SAAVA,OAAU,CAACC,GAAD,EAAMC,IAAN;AAAA,SAAe,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;AAC7D,OAAIC,SAAS,EAAb;AACA,OAAIC,SAAS,KAAb;;AAEA,OAAIL,KAAKM,KAAT,EAAgB;AACfD,aAAS,IAAT;AACAD,WAAOE,KAAP,GAAeN,KAAKM,KAApB;AACA,WAAON,KAAKM,KAAZ;AACA;;AAED,OAAIN,KAAKO,IAAT,EAAe;AACdH,WAAOG,IAAP,GAAcP,KAAKO,IAAnB;AACA,WAAOP,KAAKO,IAAZ;AACA;;AAED,OAAIF,MAAJ,EAAY;AACXL,SAAKQ,OAAL,GAAe,CAACJ,MAAD,CAAf;AACA;;AAEDF,WAAQ;AACPH,YADO;AAEPC;AAFO,IAAR;AAIA,GAvB4B,CAAf;AAAA,EAAd;;AAyBAS,QAAOC,IAAP,CAAYd,KAAZ,EAAmBe,OAAnB,CAA2B;AAAA,SAAKd,SAASe,IAAT,CAAed,QAAQe,CAAR,EAAWjB,MAAMiB,CAAN,CAAX,CAAf,CAAL;AAAA,EAA3B;AACA,QAAOZ,QAAQa,GAAR,CAAYjB,QAAZ,CAAP;AACA,CA7BM","file":"dbMigrations.js","sourcesContent":["export const migrateToV2 = function (tasks) {\n\tlet promises = []\n\tlet migrate = (key, task) => new Promise((resolve, reject) => {\n\t\tlet timing = {}\n\t\tlet update = false\n\n\t\tif (task.start) {\n\t\t\tupdate = true\n\t\t\ttiming.start = task.start\n\t\t\tdelete task.start\n\t\t}\n\n\t\tif (task.stop) {\n\t\t\ttiming.stop = task.stop\n\t\t\tdelete task.stop\n\t\t}\n\n\t\tif (update) {\n\t\t\ttask.timings = [timing]\n\t\t}\n\n\t\tresolve({\n\t\t\tkey,\n\t\t\ttask\n\t\t})\n\t})\n\n\tObject.keys(tasks).forEach(k => promises.push( migrate(k, tasks[k]) ))\n\treturn Promise.all(promises)\n}\n"]} \ No newline at end of file diff --git a/lib/core/output.js b/lib/core/output.js index 3b9e401..e61af7e 100644 --- a/lib/core/output.js +++ b/lib/core/output.js @@ -1,9 +1,9 @@ 'use strict'; Object.defineProperty(exports, "__esModule", { - value: true + value: true }); -exports.cliSuccess = exports.cliError = exports.outputVertical = exports.outputConfig = exports.sumarize = undefined; +exports.cliSuccess = exports.cliError = exports.outputVertical = exports.outputConfig = exports.calcTime = exports.summarize = undefined; var _moment = require('moment'); @@ -23,72 +23,95 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -var sumarize = exports.sumarize = function sumarize(search, tasks, rate, full, format) { - var table = new _cliTable2.default({ - head: ['Duration', 'Dates', 'Task'], - chars: { 'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': '' }, - colAligns: ['right', 'center', 'left'], - style: { head: ['green'] } - }); - var total = 0; - var head = 'Search: ' + search + ' \n'; - - tasks.forEach(function (task, index) { - var name = task.name; - task = task.task; - - var duration = task.getSeconds(); - total += duration; - - table.push([(0, _utils.humanParseDiff)(duration), (0, _moment2.default)(task.getStartDate()).format(format), name]); - }); - - console.log(table.toString()); - - if (full) { - var table2 = new _cliTable2.default(); - table2.push({ 'Search': ['\"' + search + '\"'] }, { 'Total time': [(0, _utils.humanParseDiff)(total)] }); - - if (rate) { - table2.push({ 'Rate': [(0, _utils.calcRate)(rate, total)] }); - } +var summarize = exports.summarize = function summarize(args) { + var table = new _cliTable2.default({ + head: ['Duration', 'Dates', 'Task'], + chars: { 'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': '' }, + colAligns: ['right', 'center', 'left'], + style: { head: ['green'] } + }); + var total = 0; + var head = 'Search: ' + args.search + ' \n'; + + args.tasks.forEach(function (task, index) { + var name = task.name; + task = task.task; + var duration = task.getSeconds(); + total += duration; + table.push([(0, _utils.humanParseDiff)(duration), (0, _moment2.default)(task.getStartDate()).format(args.format), name]); + }); + + console.log(table.toString()); + + if (args.full) { + var table2 = new _cliTable2.default(); + table2.push({ 'Search': ['\"' + args.search + '\"'] }, { 'Total time': [(0, _utils.humanParseDiff)(total)] }); + if (args.rate) table2.push({ 'Rate': [(0, _utils.calcRate)(args.rate, total)] }); + if (args.timespan) { + var obj = {}; + obj['Time (' + args.timespan + ')'] = [calcTime(args.timespan, args.tasks)]; + table2.push(obj); + } + console.log(table2.toString()); + } +}; - console.log(table2.toString()); - } +var calcTime = exports.calcTime = function calcTime(timespan, tasks) { + var results = []; + var pTimespan = (0, _utils.recognizeModifierTiming)(timespan)[0]; + var limit = (0, _moment2.default)().subtract(pTimespan.value, pTimespan.momentKey); + var multipleOutput = tasks.length > 1 ? true : false; + tasks.forEach(function (el) { + console.log(); + var checkins = el.task.task.timings.reverse(); + var sum = 0; + var overflow = 0; + var result = ''; + for (var i = 0; i < checkins.length; i++) { + if ((0, _moment2.default)(checkins[i].stop).isBefore(limit)) break; + sum += (0, _moment2.default)(checkins[i].stop).diff(checkins[i].start, 's'); + if ((0, _moment2.default)(checkins[i].start).isBefore(limit)) { + overflow = (0, _moment2.default)(limit).diff(checkins[i].start, 's'); + break; + } + } + if (multipleOutput) result += el.name + '\n'; + result += (0, _utils.humanParseDiff)(sum, true, true); + if (overflow) result += '\n- ' + (0, _utils.humanParseDiff)(overflow, true); + results.push(result); + }); + return results.join('\n\n'); }; var outputConfig = exports.outputConfig = function outputConfig(config) { - var table = new _cliTable2.default({ - head: ['Key', 'value'], - chars: { 'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': '' }, - colAligns: ['center', 'center'], - style: { head: ['green'] } - }); - - Object.keys(config).map(function (e) { - return table.push([e, config[e]]); - }); - - console.log(table.toString()); + var table = new _cliTable2.default({ + head: ['Key', 'value'], + chars: { 'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': '' }, + colAligns: ['center', 'center'], + style: { head: ['green'] } + }); + Object.keys(config).map(function (e) { + return table.push([e, config[e]]); + }); + console.log(table.toString()); }; var outputVertical = exports.outputVertical = function outputVertical() { - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - var table2 = new _cliTable2.default(); - var key = args.splice(0, 1); - table2.push(_defineProperty({}, key, args)); - - return table2.toString(); + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var table2 = new _cliTable2.default(); + var key = args.splice(0, 1); + table2.push(_defineProperty({}, key, args)); + return table2.toString(); }; var cliError = exports.cliError = function cliError(err) { - console.error(_chalk2.default.red('Error: ' + err)); + console.error(_chalk2.default.red('Error: ' + err)); }; var cliSuccess = exports.cliSuccess = function cliSuccess(err) { - console.log(_chalk2.default.green(err)); + console.log(_chalk2.default.green(err)); }; //# 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 2df6e59..c0e7e1d 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","chars","colAligns","style","total","forEach","task","index","name","duration","getSeconds","push","getStartDate","console","log","toString","table2","outputConfig","config","Object","keys","map","e","outputVertical","args","key","splice","cliError","err","error","red","cliSuccess","green"],"mappings":"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","file":"output.js","sourcesContent":["import moment from 'moment'\nimport Table from 'cli-table'\nimport chalk from 'chalk'\n\nimport { humanParseDiff, calcRate } from './utils'\n\nexport const sumarize = function(search, tasks, rate, full, format) {\n let table = new Table({\n head: ['Duration', 'Dates', 'Task'],\n chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''},\n colAligns: ['right', 'center', 'left'],\n style: { head: ['green'] }\n });\n let total = 0\n let head= `Search: ${search} \\n`\n\n tasks.forEach((task, index) => {\n let name = task.name\n task = task.task\n\n let duration = task.getSeconds()\n total += duration\n\n table.push([humanParseDiff(duration), moment(task.getStartDate()).format(format), name])\n })\n\n console.log(table.toString());\n\n if (full){\n let table2 = new Table()\n table2.push(\n { 'Search': ['\\\"' + search + '\\\"'] },\n { 'Total time': [humanParseDiff(total)] }\n )\n\n if (rate){\n table2.push({ 'Rate': [calcRate(rate, total)] })\n }\n\n console.log(table2.toString());\n }\n}\n\nexport const outputConfig = function (config){\n let table = new Table({\n head: ['Key', 'value'],\n chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''},\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(chalk.red(`Error: ${err}`))\n}\n\nexport const cliSuccess = function(err) {\n console.log(chalk.green(err))\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/output.js"],"names":["summarize","args","table","head","chars","colAligns","style","total","search","tasks","forEach","task","index","name","duration","getSeconds","push","getStartDate","format","console","log","toString","full","table2","rate","timespan","obj","calcTime","results","pTimespan","limit","subtract","value","momentKey","multipleOutput","length","checkins","el","timings","reverse","sum","overflow","result","i","stop","isBefore","diff","start","join","outputConfig","config","Object","keys","map","e","outputVertical","key","splice","cliError","err","error","red","cliSuccess","green"],"mappings":"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","file":"output.js","sourcesContent":["import moment from 'moment'\nimport Table from 'cli-table'\nimport chalk from 'chalk'\nimport {recognizeModifierTiming, humanParseDiff, calcRate} from './utils'\n\nexport const summarize = function(args) {\n\tlet table = new Table({\n\t\thead: ['Duration', 'Dates', 'Task'],\n\t\tchars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''},\n\t\tcolAligns: ['right', 'center', 'left'],\n\t\tstyle: { head: ['green'] }\n\t});\n\tlet total = 0\n\tlet head = `Search: ${args.search} \\n`\n\n\targs.tasks.forEach((task, index) => {\n\t\tlet name = task.name\n\t\ttask = task.task\n\t\tlet duration = task.getSeconds()\n\t\ttotal += duration\n\t\ttable.push([humanParseDiff(duration), moment(task.getStartDate()).format(args.format), name])\n\t})\n\n\tconsole.log(table.toString());\n\n\tif (args.full) {\n\t\tlet table2 = new Table()\n\t\ttable2.push(\n\t\t\t{'Search': ['\\\"' + args.search + '\\\"']},\n\t\t\t{'Total time': [humanParseDiff(total)]}\n\t\t)\n\t\tif (args.rate)\n\t\t\ttable2.push({'Rate': [calcRate(args.rate, total)]})\n\t\tif (args.timespan) {\n\t\t\tlet obj = {}\n\t\t\tobj['Time (' + args.timespan + ')'] = [calcTime(args.timespan, args.tasks)]\n\t\t\ttable2.push(obj)\n\t\t}\n\t\tconsole.log(table2.toString());\n\t}\n}\n\nexport const calcTime = function(timespan, tasks) {\n\tlet results = []\n\tlet pTimespan = recognizeModifierTiming(timespan)[0]\n\tlet limit = moment().subtract(pTimespan.value, pTimespan.momentKey)\n\tlet multipleOutput = (tasks.length > 1)? true : false\n\ttasks.forEach(el => {\n\t\tconsole.log()\n\t\tlet checkins = el.task.task.timings.reverse()\n\t\tlet sum = 0\n\t\tlet overflow = 0\n\t\tlet result = ''\n\t\tfor (let i = 0; i < checkins.length; i++) {\n\t\t\tif (moment(checkins[i].stop).isBefore(limit))\n\t\t\t\tbreak\n\t\t\tsum += moment(checkins[i].stop).diff(checkins[i].start, 's')\n\t\t\tif (moment(checkins[i].start).isBefore(limit)) {\n\t\t\t\toverflow = moment(limit).diff(checkins[i].start, 's')\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif (multipleOutput)\n\t\t\tresult += el.name + '\\n'\n\t\tresult += humanParseDiff(sum, true, true)\n\t\tif (overflow)\n\t\t\tresult += '\\n- ' + humanParseDiff(overflow, true)\n\t\tresults.push(result)\n\t})\n\treturn results.join('\\n\\n')\n}\n\nexport const outputConfig = function (config) {\n\tlet table = new Table({\n\t\thead: ['Key', 'value'],\n\t\tchars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''},\n\t\tcolAligns: ['center', 'center'],\n\t\tstyle: { head: ['green'] }\n\t});\n\tObject.keys(config).map(e => table.push([e, config[e]]))\n\tconsole.log(table.toString());\n}\n\nexport const outputVertical = function (...args) {\n\tlet table2 = new Table()\n\t\tlet key = args.splice(0, 1)\n\t\ttable2.push(\n\t\t\t{ [key]: args },\n\t\t)\n\t\treturn table2.toString()\n}\n\nexport const cliError = function(err) {\n\tconsole.error(chalk.red(`Error: ${err}`))\n}\n\nexport const cliSuccess = function(err) {\n\tconsole.log(chalk.green(err))\n}\n"]} \ No newline at end of file diff --git a/lib/core/utils.js b/lib/core/utils.js index 5c2110f..8c86d46 100644 --- a/lib/core/utils.js +++ b/lib/core/utils.js @@ -1,49 +1,52 @@ 'use strict'; Object.defineProperty(exports, "__esModule", { - value: true + value: true }); var recognizeModifierTiming = exports.recognizeModifierTiming = function recognizeModifierTiming(string) { - var r = /(\d{1,})([hms])/g; - var arr = void 0; - var res = []; - while ((arr = r.exec(string)) !== null) { - res.push({ - value: arr[1], - momentKey: arr[2] - }); - } - - return res; + var r = /(\d+)([Mwdhms])/g; + var arr = void 0; + var res = []; + while ((arr = r.exec(string)) !== null) { + res.push({ + value: parseInt(arr[1]), + momentKey: arr[2] + }); + } + return res; }; var calcRate = exports.calcRate = function calcRate(rate, total) { - var amount = void 0; - var mod = rate.substr(rate.length - 1); - var value = rate.slice(0, rate.length - 1); - - switch (mod) { - case 'h': - amount = total / 60 / 60 * parseFloat(value); - break; - case 'm': - amount = total / 60 * parseFloat(value); - break; - case 's': - amount = total * parseFloat(value); - break; - } - - return amount.toFixed(2); + var amount = void 0; + var mod = rate.substr(rate.length - 1); + var value = rate.slice(0, rate.length - 1); + switch (mod) { + case 'h': + amount = total / 60 / 60 / parseFloat(value); + break; + case 'm': + amount = total / 60 / parseFloat(value); + break; + case 's': + amount = total / parseFloat(value); + break; + } + if (!amount) { + console.error('Invalid rate', rate); + return; + } + return amount.toFixed(2) + (value === '1' ? mod : ' * ' + rate); }; -var humanParseDiff = exports.humanParseDiff = function humanParseDiff(secs) { - var hours = Math.floor(secs / 3600); - var minutes = Math.floor((secs - hours * 3600) / 60); - var seconds = secs - hours * 3600 - minutes * 60; - hours = hours == 0 ? '' : (hours < 10 ? '0' + hours : hours) + 'h'; - minutes = minutes == 0 && hours == '' ? '' : (minutes < 10 ? '0' + minutes : minutes) + 'm'; - seconds = seconds == 0 ? '' : (seconds < 10 ? '0' + seconds : seconds) + 's'; - return hours + minutes + seconds; +var humanParseDiff = exports.humanParseDiff = function humanParseDiff(secs, noSecOutput, zeroOutput) { + if (!secs) return zeroOutput ? '0m' : ''; + var hours = Math.floor(secs / 3600); + var minutes = Math.floor((secs - hours * 3600) / 60); + var seconds = secs - hours * 3600 - minutes * 60; + hours = hours == 0 ? '' : (hours < 10 ? '0' + hours : hours) + 'h'; + minutes = minutes == 0 && hours == '' ? '' : (minutes < 10 ? '0' + minutes : minutes) + 'm'; + if (noSecOutput) return hours + minutes; + seconds = seconds == 0 ? '' : (seconds < 10 ? '0' + seconds : seconds) + 's'; + return hours + minutes + 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 883deb8..1f02c57 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,EAAb,GAAkB,CAACA,QAAQ,EAAR,GAAa,MAAMA,KAAnB,GAA2BA,KAA5B,IAAqC,GAAhE;AACAG,cAAYA,WAAW,CAAX,IAAgBH,SAAS,EAA1B,GAAgC,EAAhC,GAAqC,CAACG,UAAU,EAAV,GAAe,MAAMA,OAArB,GAA+BA,OAAhC,IAA2C,GAA3F;AACAC,cAAWA,WAAW,CAAX,GAAe,EAAf,GAAoB,CAACA,UAAW,EAAX,GAAgB,MAAMA,OAAtB,GAAgCA,OAAjC,IAA4C,GAA3E;AACA,WAAOJ,QAAQG,OAAR,GAAkBC,OAAzB;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 ? '' : (hours < 10 ? '0' + hours : hours) + 'h')\n minutes = ((minutes == 0 && hours == '') ? '' : (minutes < 10 ? '0' + minutes : minutes) + 'm')\n seconds = (seconds == 0 ? '' : (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","parseInt","momentKey","calcRate","rate","total","amount","mod","substr","length","slice","parseFloat","console","error","toFixed","humanParseDiff","secs","noSecOutput","zeroOutput","hours","Math","floor","minutes","seconds"],"mappings":";;;;;AAAO,IAAMA,4DAA0B,SAA1BA,uBAA0B,CAASC,MAAT,EAAiB;AACvD,KAAIC,IAAI,kBAAR;AACA,KAAIC,YAAJ;AACA,KAAIC,MAAM,EAAV;AACA,QAAO,CAACD,MAAMD,EAAEG,IAAF,CAAOJ,MAAP,CAAP,MAA2B,IAAlC,EAAwC;AACvCG,MAAIE,IAAJ,CAAS;AACRC,UAAOC,SAASL,IAAI,CAAJ,CAAT,CADC;AAERM,cAAWN,IAAI,CAAJ;AAFH,GAAT;AAIA;AACD,QAAOC,GAAP;AACA,CAXM;;AAaA,IAAMM,8BAAW,SAAXA,QAAW,CAASC,IAAT,EAAeC,KAAf,EAAsB;AAC7C,KAAIC,eAAJ;AACA,KAAIC,MAAMH,KAAKI,MAAL,CAAYJ,KAAKK,MAAL,GAAc,CAA1B,CAAV;AACA,KAAIT,QAAQI,KAAKM,KAAL,CAAW,CAAX,EAAcN,KAAKK,MAAL,GAAc,CAA5B,CAAZ;AACA,SAAQF,GAAR;AACC,OAAK,GAAL;AACCD,YAAUD,QAAM,EAAN,GAAS,EAAV,GAAgBM,WAAWX,KAAX,CAAzB;AACA;AACD,OAAK,GAAL;AACCM,YAAUD,QAAM,EAAP,GAAaM,WAAWX,KAAX,CAAtB;AACA;AACD,OAAK,GAAL;AACCM,YAASD,QAAQM,WAAWX,KAAX,CAAjB;AACA;AATF;AAWA,KAAI,CAACM,MAAL,EAAa;AACZM,UAAQC,KAAR,CAAc,cAAd,EAA8BT,IAA9B;AACA;AACA;AACD,QAAOE,OAAOQ,OAAP,CAAe,CAAf,KAAsBd,UAAU,GAAX,GAAiBO,GAAjB,GAAuB,QAAQH,IAApD,CAAP;AACA,CApBM;;AAsBA,IAAMW,0CAAiB,SAAjBA,cAAiB,CAASC,IAAT,EAAeC,WAAf,EAA4BC,UAA5B,EAAwC;AACrE,KAAI,CAACF,IAAL,EACC,OAAOE,aAAY,IAAZ,GAAmB,EAA1B;AACD,KAAIC,QAAUC,KAAKC,KAAL,CAAWL,OAAO,IAAlB,CAAd;AACA,KAAIM,UAAUF,KAAKC,KAAL,CAAW,CAACL,OAAQG,QAAQ,IAAjB,IAA0B,EAArC,CAAd;AACA,KAAII,UAAUP,OAAQG,QAAQ,IAAhB,GAAyBG,UAAU,EAAjD;AACAH,SAASA,SAAS,CAAT,GAAa,EAAb,GAAkB,CAACA,QAAQ,EAAR,GAAa,MAAMA,KAAnB,GAA2BA,KAA5B,IAAqC,GAAhE;AACAG,WAAYA,WAAW,CAAX,IAAgBH,SAAS,EAA1B,GAAgC,EAAhC,GAAqC,CAACG,UAAU,EAAV,GAAe,MAAMA,OAArB,GAA+BA,OAAhC,IAA2C,GAA3F;AACA,KAAIL,WAAJ,EAAiB,OAAOE,QAAQG,OAAf;AACjBC,WAAWA,WAAW,CAAX,GAAe,EAAf,GAAoB,CAACA,UAAW,EAAX,GAAgB,MAAMA,OAAtB,GAAgCA,OAAjC,IAA4C,GAA3E;AACA,QAAOJ,QAAQG,OAAR,GAAkBC,OAAzB;AACA,CAXM","file":"utils.js","sourcesContent":["export const recognizeModifierTiming = function(string) {\n\tlet r = /(\\d+)([Mwdhms])/g\n\tlet arr\n\tlet res = []\n\twhile ((arr = r.exec(string)) !== null) {\n\t\tres.push({\n\t\t\tvalue: parseInt(arr[1]),\n\t\t\tmomentKey: arr[2]\n\t\t})\n\t}\n\treturn res\n}\n\nexport const calcRate = function(rate, total) {\n\tlet amount\n\tlet mod = rate.substr(rate.length - 1)\n\tlet value = rate.slice(0, rate.length - 1)\n\tswitch (mod) {\n\t\tcase 'h':\n\t\t\tamount = (total/60/60) / parseFloat(value)\n\t\t\tbreak;\n\t\tcase 'm':\n\t\t\tamount = (total/60) / parseFloat(value)\n\t\t\tbreak;\n\t\tcase 's':\n\t\t\tamount = total / parseFloat(value)\n\t\t\tbreak;\n\t}\n\tif (!amount) {\n\t\tconsole.error('Invalid rate', rate)\n\t\treturn\n\t}\n\treturn amount.toFixed(2) + ((value === '1')? mod : ' * ' + rate)\n}\n\nexport const humanParseDiff = function(secs, noSecOutput, zeroOutput) {\n\tif (!secs)\n\t\treturn zeroOutput? '0m' : ''\n\tlet hours = Math.floor(secs / 3600)\n\tlet minutes = Math.floor((secs - (hours * 3600)) / 60)\n\tlet seconds = secs - (hours * 3600) - (minutes * 60)\n\thours = (hours == 0 ? '' : (hours < 10 ? '0' + hours : hours) + 'h')\n\tminutes = ((minutes == 0 && hours == '') ? '' : (minutes < 10 ? '0' + minutes : minutes) + 'm')\n\tif (noSecOutput) return hours + minutes\n\tseconds = (seconds == 0 ? '' : (seconds < 10 ? '0' + seconds : seconds) + 's')\n\treturn hours + minutes + seconds\n}\n"]} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index 7093506..6eaa893 100644 --- a/lib/index.js +++ b/lib/index.js @@ -33,10 +33,8 @@ var _autocomplete2 = _interopRequireDefault(_autocomplete); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var config = new _configstore2.default(_package2.default.name, { - tasks: {}, - config: { - 'format.output': 'DD/MM' - } + tasks: {}, + config: { 'format.output': 'DD/MM' } }); (0, _updateNotifier2.default)({ pkg: _package2.default }).notify(); @@ -50,91 +48,102 @@ var EXEC = false; _commander2.default.version(_package2.default.version).description('Tiny time tracker for projects').option('--updateDB', 'Bool to update the db'); _commander2.default.command('start [description]').description('Start task with a description.').alias('s').action(function (key, description) { - description = description ? Array.isArray(description) ? description.join(' ') : description : null; - manager.startTask(key, description); - EXEC = true; + description = description ? Array.isArray(description) ? description.join(' ') : description : null; + manager.startTask(key, description); + EXEC = true; }); -_commander2.default.command('pause ').description('Pause task').alias('p').action(function (key) { - manager.pauseTask(key); - EXEC = true; +_commander2.default.command('pause [task_key]').description('Pause task(s)').alias('p').action(function (key) { + manager.pauseTasks(key); + EXEC = true; }); -_commander2.default.command('unpause ').description('Unpause task').alias('up').action(function (key) { - manager.unpauseTask(key); - EXEC = true; +_commander2.default.command('unpause [task_key]').description('Unpause task(s)').alias('up').action(function (key) { + manager.unpauseTasks(key); + EXEC = true; }); _commander2.default.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; - manager.stopTask(key, description); - EXEC = true; + description = description ? Array.isArray(description) ? description.join(' ') : description : null; + manager.stopTask(key, description); + EXEC = true; }); _commander2.default.command('description ').description('Add description to your task.').alias('d').action(function (key, text) { - text = Array.isArray(text) ? text.join(' ') : text; - manager.addDescription(key, text); - EXEC = true; + text = Array.isArray(text) ? text.join(' ') : text; + manager.addDescription(key, text); + EXEC = true; }); _commander2.default.command('add ').description('Adds time to a task. Example: "1h2m3s"').action(function (key, stringTime) { - manager.modifyTask('add', key, stringTime); - manager.sumarize(key, manager.search(key), false); - EXEC = true; + manager.modifyTask('add', key, stringTime); + manager.summarize({ key: key, rate: manager.search(key), full: false }); + EXEC = true; }); _commander2.default.command('subtract ').description('Subtract time to a task. Example: "1h2m3s"').alias('sub').action(function (key, stringTime) { - manager.modifyTask('subtract', key, stringTime); - manager.sumarize(key, manager.search(key), false); - EXEC = true; + manager.modifyTask('subtract', key, stringTime); + manager.summarize({ key: key, rate: manager.search(key), full: false }); + EXEC = true; }); _commander2.default.command('report [task_string] [rate]').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'; - manager.sumarize(tasks, rate); - EXEC = true; + tasks = tasks ? tasks : 'all'; + manager.summarize({ key: tasks, rate: rate }); + EXEC = true; +}); + +_commander2.default.command('summarize [task_string] [timespan]').description('Summarize time of the tasks, empty for select all tasks. Can pass a timespan (1h).').alias('sum').action(function (tasks, timespan) { + tasks = tasks ? tasks : 'all'; + manager.summarize({ key: tasks, timespan: timespan }); + EXEC = true; }); _commander2.default.command('log ').description('Logs the time of the task').alias('l').action(function (key) { - setInterval(function () { - var text = (0, _output.outputVertical)('Task:', key, (0, _utils.humanParseDiff)(manager.getTime(key))); - process.stdout.write(text); - process.stdout.moveCursor(0, -2); - }, 1000); - EXEC = true; + setInterval(function () { + var text = (0, _output.outputVertical)('Task:', key, (0, _utils.humanParseDiff)(manager.getTime(key))); + process.stdout.write(text); + process.stdout.moveCursor(0, -2); + }, 1000); + EXEC = true; }); _commander2.default.command('export').description('Export the tasks in a JSON').alias('e').action(function (key) { - console.log(JSON.stringify(manager.getTasksJson(), null, 4)); - EXEC = true; + console.log(JSON.stringify(manager.getTasksJson(), null, 4)); + EXEC = true; }); _commander2.default.command('delete [task_string]').description('Remove tasks from the list. Empty for select all tasks').alias('del').action(function (string) { - string = string ? string : 'all'; - manager.delete(string); - EXEC = true; + string = string ? string : 'all'; + manager.delete(string); + EXEC = true; }); _commander2.default.command('configure ').description('Configure the value of the config passing a key').action(function (key, value) { - manager.configure(key, value); - EXEC = true; + manager.configure(key, value); + EXEC = true; }); _commander2.default.command('configuration').description('Output configuration').action(function (string) { - (0, _output.outputConfig)(manager.getConfig()); - EXEC = true; + (0, _output.outputConfig)(manager.getConfig()); + EXEC = true; +}); + +_commander2.default.command('status').description('Display timer status').alias('st').action(function (string) { + manager.getStatus(); + EXEC = true; }); _commander2.default.parse(process.argv); if (_commander2.default.updateDB) { - manager.update(); - EXEC = true; + manager.update(); + EXEC = true; } if (!EXEC) { - (0, _output.cliError)('You must use a valid command.'); - _commander2.default.outputHelp(); - process.exit(1); + (0, _output.cliError)('You must use a valid command.'); + _commander2.default.outputHelp(); + process.exit(1); } //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/lib/index.js.map b/lib/index.js.map index 17aa3c9..747acfb 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","console","log","JSON","stringify","getTasksJson","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')\n .description('Export the tasks in a JSON')\n .alias('e')\n .action(function(key) {\n console.log(JSON.stringify(manager.getTasksJson(), null, 4))\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","pauseTasks","unpauseTasks","stopTask","text","addDescription","stringTime","modifyTask","summarize","rate","search","full","timespan","setInterval","getTime","process","stdout","write","moveCursor","console","log","JSON","stringify","getTasksJson","string","delete","value","configure","getConfig","getStatus","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\ttasks: {},\n\tconfig: {'format.output': 'DD/MM'}\n})\n\nupdateNotifier({pkg}).notify()\n\nconst manager = new Manager(config)\nautocomplete(config)\n\n//Exec\nlet EXEC = false\n\nprogram\n\t.version(pkg.version)\n\t.description('Tiny time tracker for projects')\n\t.option('--updateDB', 'Bool to update the db')\n\nprogram\n\t.command('start [description]')\n\t.description('Start task with a description.')\n\t.alias('s')\n\t.action(function(key, description) {\n\t\tdescription = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n\t\tmanager.startTask(key, description)\n\t\tEXEC = true\n\t})\n\nprogram\n\t.command('pause [task_key]')\n\t.description('Pause task(s)')\n\t.alias('p')\n\t.action(function(key) {\n\t\tmanager.pauseTasks(key)\n\t\tEXEC = true\n\t})\n\nprogram\n\t.command('unpause [task_key]')\n\t.description('Unpause task(s)')\n\t.alias('up')\n\t.action(function(key) {\n\t\tmanager.unpauseTasks(key)\n\t\tEXEC = true\n\t})\n\nprogram\n\t.command('finish [description]')\n\t.description('Stop task, you can add a description')\n\t.alias('f')\n\t.action(function(key, description) {\n\t\tdescription = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n\t\tmanager.stopTask(key, description)\n\t\tEXEC = true\n\t})\n\nprogram\n\t.command('description ')\n\t.description('Add description to your task.')\n\t.alias('d')\n\t.action(function(key, text) {\n\t\ttext = Array.isArray(text) ? text.join(' ') : text\n\t\tmanager.addDescription(key, text)\n\t\tEXEC = true\n\t})\n\nprogram\n\t.command('add ')\n\t.description('Adds time to a task. Example: \"1h2m3s\"')\n\t.action(function(key, stringTime) {\n\t\tmanager.modifyTask('add', key, stringTime)\n\t\tmanager.summarize({key: key, rate: manager.search(key), full: false})\n\t\tEXEC = true\n\t})\n\nprogram\n\t.command('subtract ')\n\t.description('Subtract time to a task. Example: \"1h2m3s\"')\n\t.alias('sub')\n\t.action(function(key, stringTime) {\n\t\tmanager.modifyTask('subtract', key, stringTime)\n\t\tmanager.summarize({key: key, rate: manager.search(key), full: false})\n\t\tEXEC = true\n\t})\n\nprogram\n\t.command('report [task_string] [rate]')\n\t.description('Report time of the tasks, empty for select all tasks. Can pass a rate (1h).')\n\t.alias('r')\n\t.action(function(tasks, rate) {\n\t\ttasks = (tasks) ? tasks : 'all'\n\t\tmanager.summarize({key: tasks, rate: rate})\n\t\tEXEC = true\n\t})\n\nprogram\n\t.command('summarize [task_string] [timespan]')\n\t.description('Summarize time of the tasks, empty for select all tasks. Can pass a timespan (1h).')\n\t.alias('sum')\n\t.action(function(tasks, timespan) {\n\t\ttasks = (tasks) ? tasks : 'all'\n\t\tmanager.summarize({key: tasks, timespan: timespan})\n\t\tEXEC = true\n\t})\n\nprogram\n\t.command('log ')\n\t.description('Logs the time of the task')\n\t.alias('l')\n\t.action(function(key) {\n\t\tsetInterval(() => {\n\t\t\tlet text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key)))\n\t\t\tprocess.stdout.write(text)\n\t\t\tprocess.stdout.moveCursor(0,-2)\n\t\t}, 1000)\n\t\tEXEC = true\n\t})\n\nprogram\n\t.command('export')\n\t.description('Export the tasks in a JSON')\n\t.alias('e')\n\t.action(function(key) {\n\t\tconsole.log(JSON.stringify(manager.getTasksJson(), null, 4))\n\t\tEXEC = true\n\t})\n\nprogram\n\t.command('delete [task_string]')\n\t.description('Remove tasks from the list. Empty for select all tasks')\n\t.alias('del')\n\t.action(function(string) {\n\t\tstring = (string) ? string : 'all'\n\t\tmanager.delete(string)\n\t\tEXEC = true\n\t})\n\nprogram\n\t.command('configure ')\n\t.description('Configure the value of the config passing a key')\n\t.action(function(key, value) {\n\t\tmanager.configure(key, value)\n\t\tEXEC = true\n\t})\n\nprogram\n\t.command('configuration')\n\t.description('Output configuration')\n\t.action(function(string) {\n\t\toutputConfig(manager.getConfig())\n\t\tEXEC = true\n\t})\n\nprogram\n\t.command('status')\n\t.description('Display timer status')\n\t.alias('st')\n\t.action(function(string) {\n\t\tmanager.getStatus()\n\t\tEXEC = true\n\t})\n\nprogram\n\t.parse(process.argv)\n\n\nif (program.updateDB) {\n\tmanager.update()\n\tEXEC = true\n}\n\nif (!EXEC) {\n\tcliError('You must use a valid command.')\n\tprogram.outputHelp()\n\tprocess.exit(1)\n}\n"]} \ No newline at end of file diff --git a/src/autocomplete.js b/src/autocomplete.js index 18fad3d..e9dc1b5 100644 --- a/src/autocomplete.js +++ b/src/autocomplete.js @@ -1,36 +1,31 @@ import omelette from 'omelette' -import { configElements } from './core/constants' +import {configElements} from './core/constants' -const autocomplete = function(config){ +const autocomplete = function(config) { - const complete = omelette("timer ") + const complete = omelette("timer ") - let allTaskKeys = function() { - this.reply(Object.keys(config.all.tasks)); - } + let allTaskKeys = function() { + this.reply(Object.keys(config.all.tasks)); + } - complete.on("cmd", function() { - this.reply(["start", "pause", "unpause", "finish", "description", "add", "subtract", "report", "log", "export", "delete", "configuration", "configure"]) - }); + complete.on("cmd", function() { + this.reply(["start", "pause", "unpause", "finish", "description", "add", "subtract", "report", "log", "export", "delete", "configuration", "configure"]) + }); - complete.on("key", function(cmd) { - let keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove'] + complete.on("key", function(cmd) { + let keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove'] + if (keyTasks.indexOf(cmd) > -1) + this.reply(Object.keys(config.all.tasks)); + if (cmd === 'configure') + this.reply(configElements); + }); - if (keyTasks.indexOf(cmd) > -1){ - this.reply(Object.keys(config.all.tasks)); - } - - if (cmd === 'configure' ){ - this.reply(configElements); - } - }); - - complete.init(); - - if (~process.argv.indexOf('--setupCLI')) { - complete.setupShellInitFile(); - } + complete.init(); + if (~process.argv.indexOf('--setupCLI')) { + complete.setupShellInitFile(); + } } export default autocomplete diff --git a/src/core/Manager.js b/src/core/Manager.js index 93e91bf..eb2c30c 100644 --- a/src/core/Manager.js +++ b/src/core/Manager.js @@ -3,194 +3,246 @@ 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 { migrateToV2 } from './dbMigrations' +import {recognizeModifierTiming} from './utils' +import {STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED, configElements} from './constants' +import {summarize, outputVertical, cliError, cliSuccess} 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 : {} - } - - getTask(key) { - let task = (this.tasks[key]) ? this.tasks[key] : null - return new Task(task) - } - - storeTask(key, task){ - let update = {} - update[key] = task.get() - this.tasks = Object.assign({}, this.tasks, update) - this.cfg.set('tasks', this.tasks) - } - - startTask(key, description) { - let t = this.getTask(key) - t.start(description) - .then(() => { - this.storeTask(key, t) - console.log( - outputVertical('Task:', key, STARTED, moment().toISOString()) - ) - }, cliError) - .catch(cliError) - } - - pauseTask(key){ - let t = this.getTask(key) - t.pause() - .then(()=>{ - this.storeTask(key, t) - console.log( - outputVertical('Task:', key, PAUSED, moment().toISOString()) - ) - }, cliError) - .catch(cliError) - } - - unpauseTask(key){ - let t = this.getTask(key) - t.unpause() - .then(()=>{ - this.storeTask(key, t) - console.log( - outputVertical('Task:', key, UNPAUSED, moment().toISOString()) - ) - }, cliError) - .catch(cliError) - } - - stopTask(key, description) { - let t = this.getTask(key) - t.stop(description) - .then(()=>{ - this.storeTask(key, t) - console.log( - outputVertical('Task:', key, FINISHED, moment().toISOString()) - ) - }, cliError) - .catch(cliError) - } - - addDescription(key, text){ - let t = this.getTask(key) - t.setDescription(text) - this.storeTask(key, t) - } - - getTime(name) { - let t = this.getTask(name) - return t.getSeconds() - } - - modifyTask(operation, name, stringTime){ - let t = this.getTask(name) - t.makeOperationOverTime(operation, stringTime) - .then(()=>{ - this.storeTask(name, t) - }, cliError) - .catch(cliError) - } - - search(string) { - let keys = Object.keys(this.tasks) - let tasks = [] - keys.forEach((key)=>{ - if (string === 'all' || key.indexOf(string) > -1){ - tasks.push({ - name: key, - task: new Task(this.tasks[key]) - }) - } - }) - return tasks - } - - delete(string) { - let tasks = this.search(string) - - 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) - } - - getTasksJson() { - return flat.unflatten(this.tasks) - } - - getConfig(){ - return this.config - } - - configure(element, value){ - - if (configElements.indexOf(element) < 0){ - return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `) - } - - let newCfg = { - [element]: value - } - - this.config = Object.assign({}, this.config, newCfg) - this.cfg.set('config', this.config) - - return this.config - } - - update() { - 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) - return newTasks - }) - .then(migratedTasks => { - this.cfg.set('tasks', migratedTasks) - this.cfg.set('config', Object.assign(this.config, { - 'config.version': '2' - })) - - cliSuccess('Configuration migrated to version 2.') - }, cliError) - .catch(cliError) - } else { - cliSuccess('No need to update the DB.') - } - } - - sumarize(key, rate, full=true){ - let tasks = this.search(key) - sumarize(key, tasks, rate, full, this.config['format.output']) - } + repositories = ['tasks', 'config'] + + constructor(cfg) { + this.cfg = cfg + this.tasks = cfg.all.tasks + this.config = (cfg.all.config) ? cfg.all.config : {} + } + + getTask(key) { + let task = (this.tasks[key]) ? this.tasks[key] : null + return new Task(task) + } + + getAllTasks(props) { + let myTasks = [] + if (!props) props = {} + Object.keys(this.tasks).forEach(key => { + if (props.filter) { + let _st = this.tasks[key].status + if (props.filter === 'unfinished') { + if (_st === FINISHED) + return + } else if (props.filter === 'running') { + if (_st === FINISHED || _st === PAUSED) + return + } else if (props.filter === 'paused') { + if (_st !== PAUSED) + return + } + } + if (props.only_key) { + myTasks.push(key) + return + } + let _task = {key: key} + if (props.status) + _task.status = this.tasks[key].status + if (props.lastLog) + _task.lastLog = this.tasks[key].log[this.tasks[key].log.length - 1] + myTasks.push(_task) + }) + return myTasks + } + + storeTask(key, task) { + let update = {} + update[key] = task.get() + this.tasks = Object.assign({}, this.tasks, update) + this.cfg.set('tasks', this.tasks) + } + + startTask(key, description) { + let t = this.getTask(key) + t.start(description) + .then(() => { + this.storeTask(key, t) + console.log( + outputVertical('Task:', key, STARTED, moment().toISOString()) + ) + }, cliError) + .catch(cliError) + } + + pauseTasks(key) { + if (key) { + this.pauseTask(key) + return + } + let running_tasks = this.getAllTasks({filter: 'running', only_key: true}) + running_tasks.forEach(el => this.pauseTask(el)) + console.log('Pausing', running_tasks.length, 'Task(s)') + } + + pauseTask(key) { + let t = this.getTask(key) + t.pause() + .then(()=>{ + this.storeTask(key, t) + console.log( + outputVertical('Task:', key, PAUSED, moment().toISOString()) + ) + }, cliError) + .catch(cliError) + } + + unpauseTasks(key) { + if (key) { + this.unpauseTask(key) + return + } + let paused_tasks = this.getAllTasks({filter: 'paused', only_key: true}) + paused_tasks.forEach(el => this.unpauseTask(el)) + console.log('Unpausing', paused_tasks.length, 'Task(s)') + } + + unpauseTask(key) { + let t = this.getTask(key) + t.unpause() + .then(()=>{ + this.storeTask(key, t) + console.log( + outputVertical('Task:', key, UNPAUSED, moment().toISOString()) + ) + }, cliError) + .catch(cliError) + } + + stopTask(key, description) { + let t = this.getTask(key) + t.stop(description) + .then(()=>{ + this.storeTask(key, t) + console.log( + outputVertical('Task:', key, FINISHED, moment().toISOString()) + ) + }, cliError) + .catch(cliError) + } + + addDescription(key, text) { + let t = this.getTask(key) + t.setDescription(text) + this.storeTask(key, t) + } + + getTime(name) { + let t = this.getTask(name) + return t.getSeconds() + } + + modifyTask(operation, name, stringTime) { + let t = this.getTask(name) + t.makeOperationOverTime(operation, stringTime) + .then(()=>{ + this.storeTask(name, t) + }, cliError) + .catch(cliError) + } + + search(string) { + let keys = Object.keys(this.tasks) + let tasks = [] + keys.forEach((key)=>{ + if (string === 'all' || key.indexOf(string) > -1){ + tasks.push({ + name: key, + task: new Task(this.tasks[key]) + }) + } + }) + return tasks + } + + delete(string) { + let tasks = this.search(string) + 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) + } + + getTasksJson() { + return flat.unflatten(this.tasks) + } + + getConfig() { + return this.config + } + + configure(element, value) { + if (configElements.indexOf(element) < 0) + return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `) + let newCfg = {[element]: value} + this.config = Object.assign({}, this.config, newCfg) + this.cfg.set('config', this.config) + return this.config + } + + update() { + 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) + return newTasks + }) + .then(migratedTasks => { + this.cfg.set('tasks', migratedTasks) + this.cfg.set('config', Object.assign(this.config, { + 'config.version': '2' + })) + cliSuccess('Configuration migrated to version 2.') + }, cliError) + .catch(cliError) + } else { + cliSuccess('No need to update the DB.') + } + } + + summarize(args) { + if (typeof args.full === 'undefined') args.full = true + summarize({ + search: args.key, + tasks: this.search(args.key), + rate: args.rate, + full: args.full, + timespan: args.timespan, + format: this.config['format.output'] + }) + } + + getStatus() { + let keys = this.getAllTasks({view: 'list', status: true, lastLog: true}) + keys.forEach(el => { + console.log(el.key, el.status, el.lastLog) + }) + } + } diff --git a/src/core/Task.js b/src/core/Task.js index 1bea713..2f9a287 100644 --- a/src/core/Task.js +++ b/src/core/Task.js @@ -1,183 +1,149 @@ import moment from 'moment' - -import { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants' -import { recognizeModifierTiming } from './Utils' -import { cliError } from './output' - +import {STARTED, PAUSED, IN_PROGRESS, FINISHED} from './constants' +import {recognizeModifierTiming} from './Utils' +import {cliError} from './output' export default class Task { - constructor(task){ - this.task = (task) ? task : { - description: '', - timings: [] - } - } - - _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){ - let timing = this.task.timings[this.task.timings.length - 1] - 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') - return - } - - this.task.timings[this.task.timings.length - 1].stop = newStop - } - - start(description){ - return new Promise((resolve, reject)=>{ - let started = false - - let timing = this.task.timings[this.task.timings.length - 1] - - if (timing && timing.start && !timing.stop) { - reject(this.error(`This task already started.`)) - } - - this.task.timings.push({ - start: moment().toDate() - }) - - this.setDescription(description) - this.setStatus(IN_PROGRESS) - this.log('start') - resolve() - }) - } - - pause(){ - return new Promise((resolve, reject)=>{ - let timing = this.task.timings[this.task.timings.length - 1] - - if (!timing){ - reject(this.error(`This task is not started, start it.`)) - } - - if (timing && timing.start && timing.stop) { - reject(this.error(`This task are ended/paused, unpaused it.`)) - } - - this.task.timings[this.task.timings.length - 1].stop = moment().toDate() - this.setStatus(PAUSED) - this.log('pause') - resolve() - }) - } - - unpause(){ - return new Promise((resolve, reject)=>{ - let timing = this.task.timings[this.task.timings.length - 1] - if (!timing){ - reject(this.error(`This task is not started, start it`)) - } - - if (timing && timing.start && !timing.stop) { - reject(this.error(`This task is started, pause/stop first`)) - } - - this.task.timings.push({ - start: moment().toDate() - }) - this.setStatus(IN_PROGRESS) - this.log('unpause') - resolve() - }) - } - - stop (description){ - return new Promise((resolve, reject)=>{ - let timing = this.task.timings[this.task.timings.length - 1] - if (!timing || timing && !timing.start){ - reject(this.error(`This task is not started, start it`)) - } - - if (timing.start && timing.stop) { - reject(this.error(`This task already ended, start/unpause it.`)) - } - - this.task.timings[this.task.timings.length - 1].stop = moment().toDate() - this.setDescription(description) - this.setStatus(FINISHED) - this.log('stop') - resolve() - }) - } - - log(operation){ - if (!this.task.log){ - this.task.log = [] - } - - this.task.log.push(`${operation}#${moment().toISOString()}`) - } - - setDescription(text){ - this.task.description = (text) ? text : (this.task.description) ? this.task.description : '' - } - - setStatus(status){ - this.task.status = status - } - - makeOperationOverTime(operation, stringTime) { - return new Promise((resolve, reject) => { - let parsed = recognizeModifierTiming(stringTime) - - try { - parsed.map((t)=>{ - this._modifyTiming(t, operation) - }) - } catch(err){ - console.error(err) - reject(this.error(`Error trying to ${operation} time to task`)) - } - this.log(`${operation}:${stringTime}`) - - resolve() - }) - } - - get(){ - return this.task - } - - getSeconds(){ - let duration = 0 - - if (this.task.timings){ - this.task.timings.forEach(timing => { - duration += this._calcTime(timing) - }) - } else { - duration = this._calcTime(this.task) - } - - return duration - } - - getStartDate(){ - if (this.task.timings){ - return this.task.timings[0].start - } else { - return this.task.start - } - } - - error(err){ - return err //+ ` \n Task: ${JSON.stringify(this.task)}` - } + constructor(task){ + this.task = (task) ? task : { + description: '', + timings: [] + } + } + + _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) { + let timing = this.task.timings[this.task.timings.length - 1] + 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') + return + } + this.task.timings[this.task.timings.length - 1].stop = newStop + } + + start(description) { + return new Promise((resolve, reject) => { + let started = false + let timing = this.task.timings[this.task.timings.length - 1] + if (timing && timing.start && !timing.stop) + reject(this.error(`This task already started.`)) + this.task.timings.push({start: moment().toDate()}) + this.setDescription(description) + this.setStatus(IN_PROGRESS) + this.log('start') + resolve() + }) + } + + pause() { + return new Promise((resolve, reject) => { + let timing = this.task.timings[this.task.timings.length - 1] + if (!timing) + reject(this.error(`This task is not started, start it.`)) + if (timing && timing.start && timing.stop) + reject(this.error(`This task are ended/paused, unpaused it.`)) + this.task.timings[this.task.timings.length - 1].stop = moment().toDate() + this.setStatus(PAUSED) + this.log('pause') + resolve() + }) + } + + unpause() { + return new Promise((resolve, reject) => { + let timing = this.task.timings[this.task.timings.length - 1] + if (!timing) + reject(this.error(`This task is not started, start it`)) + if (timing && timing.start && !timing.stop) + reject(this.error(`This task is started, pause/stop first`)) + this.task.timings.push({start: moment().toDate()}) + this.setStatus(IN_PROGRESS) + this.log('unpause') + resolve() + }) + } + + stop(description) { + return new Promise((resolve, reject) => { + let timing = this.task.timings[this.task.timings.length - 1] + if (!timing || timing && !timing.start) + reject(this.error(`This task is not started, start it`)) + if (timing.start && timing.stop) + reject(this.error(`This task already ended, start/unpause it.`)) + this.task.timings[this.task.timings.length - 1].stop = moment().toDate() + this.setDescription(description) + this.setStatus(FINISHED) + this.log('stop') + resolve() + }) + } + + log(operation) { + if (!this.task.log) + this.task.log = [] + this.task.log.push(`${operation}#${moment().toISOString()}`) + } + + setDescription(text) { + this.task.description = (text) ? text : (this.task.description) ? this.task.description : '' + } + + setStatus(status) { + this.task.status = status + } + + makeOperationOverTime(operation, stringTime) { + return new Promise((resolve, reject) => { + let parsed = recognizeModifierTiming(stringTime) + try { + parsed.map((t) => { + this._modifyTiming(t, operation) + }) + } catch(err) { + console.error(err) + reject(this.error(`Error trying to ${operation} time to task`)) + } + this.log(`${operation}:${stringTime}`) + resolve() + }) + } + + get() { + return this.task + } + + getSeconds() { + let duration = 0 + if (this.task.timings) { + this.task.timings.forEach(timing => { + duration += this._calcTime(timing) + }) + } else { + duration = this._calcTime(this.task) + } + return duration + } + + getStartDate() { + if (this.task.timings){ + return this.task.timings[0].start + } else { + return this.task.start + } + } + + error(err) { + return err //+ ` \n Task: ${JSON.stringify(this.task)}` + } } diff --git a/src/core/dbMigrations.js b/src/core/dbMigrations.js index 020b5fe..3b72eda 100644 --- a/src/core/dbMigrations.js +++ b/src/core/dbMigrations.js @@ -1,32 +1,30 @@ -export const migrateToV2 = function (tasks){ - let promises = [] - let migrate = (key, task) => new Promise((resolve, reject) => { +export const migrateToV2 = function (tasks) { + let promises = [] + 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]) )) - - return Promise.all(promises) + Object.keys(tasks).forEach(k => promises.push( migrate(k, tasks[k]) )) + return Promise.all(promises) } diff --git a/src/core/output.js b/src/core/output.js index d571d92..2e4a5c9 100644 --- a/src/core/output.js +++ b/src/core/output.js @@ -1,73 +1,99 @@ import moment from 'moment' import Table from 'cli-table' import chalk from 'chalk' - -import { humanParseDiff, calcRate } from './utils' - -export const sumarize = function(search, tasks, rate, full, format) { - let table = new Table({ - head: ['Duration', 'Dates', 'Task'], - chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''}, - colAligns: ['right', 'center', 'left'], - style: { head: ['green'] } - }); - let total = 0 - let head= `Search: ${search} \n` - - tasks.forEach((task, index) => { - let name = task.name - task = task.task - - let duration = task.getSeconds() - total += duration - - table.push([humanParseDiff(duration), moment(task.getStartDate()).format(format), name]) - }) - - console.log(table.toString()); - - if (full){ - let table2 = new Table() - table2.push( - { 'Search': ['\"' + search + '\"'] }, - { 'Total time': [humanParseDiff(total)] } - ) - - if (rate){ - table2.push({ 'Rate': [calcRate(rate, total)] }) - } - - console.log(table2.toString()); - } +import {recognizeModifierTiming, humanParseDiff, calcRate} from './utils' + +export const summarize = function(args) { + let table = new Table({ + head: ['Duration', 'Dates', 'Task'], + chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''}, + colAligns: ['right', 'center', 'left'], + style: { head: ['green'] } + }); + let total = 0 + let head = `Search: ${args.search} \n` + + args.tasks.forEach((task, index) => { + let name = task.name + task = task.task + let duration = task.getSeconds() + total += duration + table.push([humanParseDiff(duration), moment(task.getStartDate()).format(args.format), name]) + }) + + console.log(table.toString()); + + if (args.full) { + let table2 = new Table() + table2.push( + {'Search': ['\"' + args.search + '\"']}, + {'Total time': [humanParseDiff(total)]} + ) + if (args.rate) + table2.push({'Rate': [calcRate(args.rate, total)]}) + if (args.timespan) { + let obj = {} + obj['Time (' + args.timespan + ')'] = [calcTime(args.timespan, args.tasks)] + table2.push(obj) + } + console.log(table2.toString()); + } } -export const outputConfig = function (config){ - let table = new Table({ - head: ['Key', 'value'], - chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''}, - colAligns: ['center', 'center'], - style: { head: ['green'] } - }); - - Object.keys(config).map(e => table.push([e, config[e]])) - - console.log(table.toString()); +export const calcTime = function(timespan, tasks) { + let results = [] + let pTimespan = recognizeModifierTiming(timespan)[0] + let limit = moment().subtract(pTimespan.value, pTimespan.momentKey) + let multipleOutput = (tasks.length > 1)? true : false + tasks.forEach(el => { + console.log() + let checkins = el.task.task.timings.reverse() + let sum = 0 + let overflow = 0 + let result = '' + for (let i = 0; i < checkins.length; i++) { + if (moment(checkins[i].stop).isBefore(limit)) + break + sum += moment(checkins[i].stop).diff(checkins[i].start, 's') + if (moment(checkins[i].start).isBefore(limit)) { + overflow = moment(limit).diff(checkins[i].start, 's') + break + } + } + if (multipleOutput) + result += el.name + '\n' + result += humanParseDiff(sum, true, true) + if (overflow) + result += '\n- ' + humanParseDiff(overflow, true) + results.push(result) + }) + return results.join('\n\n') } -export const outputVertical = function (...args){ - let table2 = new Table() - let key = args.splice(0, 1) - table2.push( - { [key]: args }, - ) +export const outputConfig = function (config) { + let table = new Table({ + head: ['Key', 'value'], + chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''}, + colAligns: ['center', 'center'], + style: { head: ['green'] } + }); + Object.keys(config).map(e => table.push([e, config[e]])) + console.log(table.toString()); +} - return table2.toString() +export const outputVertical = function (...args) { + let table2 = new Table() + let key = args.splice(0, 1) + table2.push( + { [key]: args }, + ) + return table2.toString() } export const cliError = function(err) { - console.error(chalk.red(`Error: ${err}`)) + console.error(chalk.red(`Error: ${err}`)) } export const cliSuccess = function(err) { - console.log(chalk.green(err)) + console.log(chalk.green(err)) } diff --git a/src/core/utils.js b/src/core/utils.js index a9103b2..10e4f87 100644 --- a/src/core/utils.js +++ b/src/core/utils.js @@ -1,43 +1,47 @@ -export const recognizeModifierTiming = function (string){ - let r = /(\d{1,})([hms])/g - let arr - let res = [] - while ((arr = r.exec(string)) !== null) { - res.push({ - value: arr[1], - momentKey: arr[2] - }) - } - - return res +export const recognizeModifierTiming = function(string) { + let r = /(\d+)([Mwdhms])/g + let arr + let res = [] + while ((arr = r.exec(string)) !== null) { + res.push({ + value: parseInt(arr[1]), + momentKey: arr[2] + }) + } + return res } -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; - case 'm': - amount = (total/60)*parseFloat(value) - break; - case 's': - amount = total*parseFloat(value) - break; - } - - return amount.toFixed(2) +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; + case 'm': + amount = (total/60) / parseFloat(value) + break; + case 's': + amount = total / parseFloat(value) + break; + } + if (!amount) { + console.error('Invalid rate', rate) + return + } + return amount.toFixed(2) + ((value === '1')? mod : ' * ' + rate) } -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 ? '' : (hours < 10 ? '0' + hours : hours) + 'h') - minutes = ((minutes == 0 && hours == '') ? '' : (minutes < 10 ? '0' + minutes : minutes) + 'm') - seconds = (seconds == 0 ? '' : (seconds < 10 ? '0' + seconds : seconds) + 's') - return hours + minutes + seconds +export const humanParseDiff = function(secs, noSecOutput, zeroOutput) { + if (!secs) + return zeroOutput? '0m' : '' + let hours = Math.floor(secs / 3600) + let minutes = Math.floor((secs - (hours * 3600)) / 60) + let seconds = secs - (hours * 3600) - (minutes * 60) + hours = (hours == 0 ? '' : (hours < 10 ? '0' + hours : hours) + 'h') + minutes = ((minutes == 0 && hours == '') ? '' : (minutes < 10 ? '0' + minutes : minutes) + 'm') + if (noSecOutput) return hours + minutes + seconds = (seconds == 0 ? '' : (seconds < 10 ? '0' + seconds : seconds) + 's') + return hours + minutes + seconds } diff --git a/src/index.js b/src/index.js index 3b7c6f5..b09786c 100644 --- a/src/index.js +++ b/src/index.js @@ -6,19 +6,17 @@ import Configstore from 'configstore' import pkg from '../package.json' import Manager from './core/Manager' -import { humanParseDiff } from './core/utils' -import { outputVertical, cliError, outputConfig } from './core/output' +import {humanParseDiff} from './core/utils' +import {outputVertical, cliError, outputConfig} from './core/output' import autocomplete from './autocomplete' const config = new Configstore(pkg.name, { - tasks:{}, - config:{ - 'format.output': 'DD/MM' - } + tasks: {}, + config: {'format.output': 'DD/MM'} }) -updateNotifier({ pkg }).notify() +updateNotifier({pkg}).notify() const manager = new Manager(config) autocomplete(config) @@ -27,147 +25,165 @@ autocomplete(config) let EXEC = false program - .version(pkg.version) - .description('Tiny time tracker for projects') - .option('--updateDB', 'Bool to update the db') - -program - .command('start [description]') - .description('Start task with a description.') - .alias('s') - .action(function(key, description) { - description = (description) ? Array.isArray(description) ? description.join(' ') : description : null - manager.startTask(key, description) - EXEC = true - }) - -program - .command('pause ') - .description('Pause task') - .alias('p') - .action(function(key) { - manager.pauseTask(key) - EXEC = true - }) - -program - .command('unpause ') - .description('Unpause task') - .alias('up') - .action(function(key) { - manager.unpauseTask(key) - 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 - manager.stopTask(key, description) - EXEC = true - }) - -program - .command('description ') - .description('Add description to your task.') - .alias('d') - .action(function(key, text) { - text = Array.isArray(text) ? text.join(' ') : text - manager.addDescription(key, text) - EXEC = true - }) - -program - .command('add ') - .description('Adds time to a task. Example: "1h2m3s"') - .action(function(key, stringTime) { - manager.modifyTask('add', key, stringTime) - manager.sumarize(key, manager.search(key), false) - EXEC = true - }) - -program - .command('subtract ') - .description('Subtract time to a task. Example: "1h2m3s"') - .alias('sub') - .action(function(key, stringTime) { - manager.modifyTask('subtract', key, stringTime) - manager.sumarize(key, manager.search(key), false) - EXEC = true - }) - -program - .command('report [task_string] [rate]') - .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' - manager.sumarize(tasks, rate) - EXEC = true - }) - -program - .command('log ') - .description('Logs the time of the task') - .alias('l') - .action(function(key) { - setInterval(() => { - let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key))) - process.stdout.write(text) - process.stdout.moveCursor(0,-2) - }, 1000) - EXEC = true - }) - -program - .command('export') - .description('Export the tasks in a JSON') - .alias('e') - .action(function(key) { - console.log(JSON.stringify(manager.getTasksJson(), null, 4)) - EXEC = true - }) - -program - .command('delete [task_string]') - .description('Remove tasks from the list. Empty for select all tasks') - .alias('del') - .action(function(string) { - string = (string) ? string : 'all' - manager.delete(string) - EXEC = true - }) - -program - .command('configure ') - .description('Configure the value of the config passing a key') - .action(function(key, value) { - manager.configure(key, value) - EXEC = true - }) - -program - .command('configuration') - .description('Output configuration') - .action(function(string) { - outputConfig(manager.getConfig()) - EXEC = true - }) - -program - .parse(process.argv) + .version(pkg.version) + .description('Tiny time tracker for projects') + .option('--updateDB', 'Bool to update the db') + +program + .command('start [description]') + .description('Start task with a description.') + .alias('s') + .action(function(key, description) { + description = (description) ? Array.isArray(description) ? description.join(' ') : description : null + manager.startTask(key, description) + EXEC = true + }) + +program + .command('pause [task_key]') + .description('Pause task(s)') + .alias('p') + .action(function(key) { + manager.pauseTasks(key) + EXEC = true + }) + +program + .command('unpause [task_key]') + .description('Unpause task(s)') + .alias('up') + .action(function(key) { + manager.unpauseTasks(key) + 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 + manager.stopTask(key, description) + EXEC = true + }) + +program + .command('description ') + .description('Add description to your task.') + .alias('d') + .action(function(key, text) { + text = Array.isArray(text) ? text.join(' ') : text + manager.addDescription(key, text) + EXEC = true + }) + +program + .command('add ') + .description('Adds time to a task. Example: "1h2m3s"') + .action(function(key, stringTime) { + manager.modifyTask('add', key, stringTime) + manager.summarize({key: key, rate: manager.search(key), full: false}) + EXEC = true + }) + +program + .command('subtract ') + .description('Subtract time to a task. Example: "1h2m3s"') + .alias('sub') + .action(function(key, stringTime) { + manager.modifyTask('subtract', key, stringTime) + manager.summarize({key: key, rate: manager.search(key), full: false}) + EXEC = true + }) + +program + .command('report [task_string] [rate]') + .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' + manager.summarize({key: tasks, rate: rate}) + EXEC = true + }) + +program + .command('summarize [task_string] [timespan]') + .description('Summarize time of the tasks, empty for select all tasks. Can pass a timespan (1h).') + .alias('sum') + .action(function(tasks, timespan) { + tasks = (tasks) ? tasks : 'all' + manager.summarize({key: tasks, timespan: timespan}) + EXEC = true + }) + +program + .command('log ') + .description('Logs the time of the task') + .alias('l') + .action(function(key) { + setInterval(() => { + let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key))) + process.stdout.write(text) + process.stdout.moveCursor(0,-2) + }, 1000) + EXEC = true + }) + +program + .command('export') + .description('Export the tasks in a JSON') + .alias('e') + .action(function(key) { + console.log(JSON.stringify(manager.getTasksJson(), null, 4)) + EXEC = true + }) + +program + .command('delete [task_string]') + .description('Remove tasks from the list. Empty for select all tasks') + .alias('del') + .action(function(string) { + string = (string) ? string : 'all' + manager.delete(string) + EXEC = true + }) + +program + .command('configure ') + .description('Configure the value of the config passing a key') + .action(function(key, value) { + manager.configure(key, value) + EXEC = true + }) + +program + .command('configuration') + .description('Output configuration') + .action(function(string) { + outputConfig(manager.getConfig()) + EXEC = true + }) + +program + .command('status') + .description('Display timer status') + .alias('st') + .action(function(string) { + manager.getStatus() + EXEC = true + }) + +program + .parse(process.argv) if (program.updateDB) { - manager.update() - EXEC = true + manager.update() + EXEC = true } if (!EXEC) { - cliError('You must use a valid command.') - program.outputHelp() - process.exit(1) + cliError('You must use a valid command.') + program.outputHelp() + process.exit(1) }