@beauraines/rtm-cli 1.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/FUNDING.yml +12 -0
- package/LICENSE +21 -0
- package/README.md +143 -0
- package/build.js +86 -0
- package/config.json +40 -0
- package/package.json +58 -0
- package/screens/ls.png +0 -0
- package/screens/lsd.png +0 -0
- package/screens/lsp.png +0 -0
- package/screens/planner.png +0 -0
- package/src/cli.js +434 -0
- package/src/cmd/add.js +100 -0
- package/src/cmd/addList.js +92 -0
- package/src/cmd/addTags.js +85 -0
- package/src/cmd/archiveList.js +78 -0
- package/src/cmd/comp.js +82 -0
- package/src/cmd/decPri.js +82 -0
- package/src/cmd/due.js +82 -0
- package/src/cmd/edit.js +82 -0
- package/src/cmd/incPri.js +82 -0
- package/src/cmd/lists.js +60 -0
- package/src/cmd/login.js +27 -0
- package/src/cmd/logout.js +31 -0
- package/src/cmd/ls.js +181 -0
- package/src/cmd/lsd.js +193 -0
- package/src/cmd/lsp.js +171 -0
- package/src/cmd/move.js +83 -0
- package/src/cmd/notes.js +150 -0
- package/src/cmd/planner.js +510 -0
- package/src/cmd/postpone.js +82 -0
- package/src/cmd/pri.js +82 -0
- package/src/cmd/remove.js +82 -0
- package/src/cmd/removeList.js +79 -0
- package/src/cmd/removeTags.js +85 -0
- package/src/cmd/renameList.js +80 -0
- package/src/cmd/reset.js +35 -0
- package/src/cmd/setUrl.js +99 -0
- package/src/cmd/tags.js +101 -0
- package/src/cmd/uncomp.js +82 -0
- package/src/cmd/url.js +92 -0
- package/src/cmd/whoami.js +36 -0
- package/src/interactive.js +65 -0
- package/src/utils/config.js +236 -0
- package/src/utils/filter.js +43 -0
- package/src/utils/finish.js +21 -0
- package/src/utils/index.js +10 -0
- package/src/utils/log.js +163 -0
- package/src/utils/login.js +69 -0
- package/src/utils/printIndicator.js +43 -0
- package/src/utils/prompt.js +126 -0
- package/src/utils/sort.js +283 -0
package/src/cmd/ls.js
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const df = require('dateformat');
|
|
4
|
+
const sort = require('../utils/sort.js');
|
|
5
|
+
const log = require('../utils/log.js');
|
|
6
|
+
const finish = require('../utils/finish.js');
|
|
7
|
+
const parseFilter = require('../utils/filter.js');
|
|
8
|
+
const config = require('../utils/config.js');
|
|
9
|
+
const printIndicator = require('../utils/printIndicator.js')
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* This command will display all of the User's tasks sorted first by list,
|
|
14
|
+
* then completed status, then priority, then due date
|
|
15
|
+
*/
|
|
16
|
+
function action(args, env) {
|
|
17
|
+
let filter = parseFilter(args.length > 0 ? args[0].join(' ') : '');
|
|
18
|
+
|
|
19
|
+
// Get the authenticated User
|
|
20
|
+
config.user(function(user) {
|
|
21
|
+
|
|
22
|
+
// Start Spinner
|
|
23
|
+
log.spinner.start("Getting Tasks...");
|
|
24
|
+
|
|
25
|
+
// Get User Tasks
|
|
26
|
+
user.tasks.get(filter, function (err, tasks) {
|
|
27
|
+
if ( err ) {
|
|
28
|
+
log.spinner.error("Could not get tasks (" + err.msg + ")");
|
|
29
|
+
return finish();
|
|
30
|
+
}
|
|
31
|
+
else if ( tasks.length === 0 ) {
|
|
32
|
+
log.spinner.error("No tasks returned");
|
|
33
|
+
return finish();
|
|
34
|
+
}
|
|
35
|
+
log.spinner.stop();
|
|
36
|
+
|
|
37
|
+
// Get Display Styles
|
|
38
|
+
let styles = config.get().styles;
|
|
39
|
+
|
|
40
|
+
// Get max task number
|
|
41
|
+
tasks.sort(sort.tasks.index);
|
|
42
|
+
let MAX_INDEX = tasks[tasks.length - 1].index;
|
|
43
|
+
|
|
44
|
+
// Sort Tasks
|
|
45
|
+
tasks.sort(sort.tasks.ls);
|
|
46
|
+
|
|
47
|
+
// Last List Name
|
|
48
|
+
let listname = "";
|
|
49
|
+
|
|
50
|
+
// Parse each task
|
|
51
|
+
for ( let i = 0; i < tasks.length; i++ ) {
|
|
52
|
+
let task = tasks[i];
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
// ==== PRINT LIST NAME ==== //
|
|
56
|
+
|
|
57
|
+
// Print New List Name
|
|
58
|
+
if ( task._list.name !== listname ) {
|
|
59
|
+
if ( listname !== "" ) {
|
|
60
|
+
log();
|
|
61
|
+
}
|
|
62
|
+
listname = task._list.name;
|
|
63
|
+
for ( let i = 0; i < MAX_INDEX.toString().length + 1; i++ ) {
|
|
64
|
+
log(' ', false);
|
|
65
|
+
}
|
|
66
|
+
log.style(listname, styles.list, true);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
// ==== PRINT TASK INFORMATION ==== //
|
|
71
|
+
|
|
72
|
+
// Print Task Index
|
|
73
|
+
log.style(_pad(task.index, MAX_INDEX), styles.index);
|
|
74
|
+
log.style(' ');
|
|
75
|
+
|
|
76
|
+
// Add the Task Priority
|
|
77
|
+
let namestyle = '';
|
|
78
|
+
if ( !task.completed ) {
|
|
79
|
+
namestyle = styles.priority[task.priority.toString()];
|
|
80
|
+
if ( task.priority === 0 ) {
|
|
81
|
+
log.style(' ');
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
log.style('(' + task.priority + ')', namestyle);
|
|
85
|
+
log.style(' ');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
namestyle = styles.completed;
|
|
90
|
+
log.style(' ');
|
|
91
|
+
log.style('x', namestyle);
|
|
92
|
+
log.style(' ');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Display subtask indicator
|
|
96
|
+
if (task.isSubtask) {
|
|
97
|
+
printIndicator('subtask',task);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Add the Task Name
|
|
101
|
+
log.style(task.name+' ', namestyle);
|
|
102
|
+
|
|
103
|
+
// Print URL Indicator
|
|
104
|
+
if ( task.url !== undefined ) {
|
|
105
|
+
printIndicator('url',task);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Print Note Indicators
|
|
109
|
+
for ( let i = 0; i < task.notes.length; i++ ) {
|
|
110
|
+
printIndicator('notes',task);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Print recurring indicator
|
|
114
|
+
if (task.isRecurring) {
|
|
115
|
+
printIndicator('recurring',task);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Print Tags
|
|
119
|
+
let tagstyle = task.isCompleted ? styles.completed : styles.tags;
|
|
120
|
+
for ( let i = 0; i < task.tags.length; i++ ) {
|
|
121
|
+
log.style(' ');
|
|
122
|
+
log.style('#' + task.tags[i], tagstyle);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Print Due Date / Completed Date
|
|
126
|
+
if ( !task.isCompleted ) {
|
|
127
|
+
if ( task.due ) {
|
|
128
|
+
log.style(' ');
|
|
129
|
+
log.style('|', styles.due);
|
|
130
|
+
log.style(' ');
|
|
131
|
+
log.style(df(task.due, config.get().dateformat), styles.due);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
if ( task.completed ) {
|
|
136
|
+
log.style(' ');
|
|
137
|
+
log.style('x', styles.completed);
|
|
138
|
+
log.style(' ');
|
|
139
|
+
log.style(df(task.completed, config.get().dateformat), styles.completed);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Finish line
|
|
144
|
+
log('');
|
|
145
|
+
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Finish
|
|
149
|
+
return finish();
|
|
150
|
+
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Pad the Index number with leading 0s
|
|
160
|
+
* @param index Task Index Number
|
|
161
|
+
* @param maxIndex Max Task Index
|
|
162
|
+
* @returns {string}
|
|
163
|
+
* @private
|
|
164
|
+
*/
|
|
165
|
+
function _pad(index, maxIndex) {
|
|
166
|
+
let max = maxIndex.toString().length;
|
|
167
|
+
let digits = index.toString().length;
|
|
168
|
+
let delta = max - digits;
|
|
169
|
+
for ( let i = 0; i < delta; i++ ) {
|
|
170
|
+
index = '0' + index;
|
|
171
|
+
}
|
|
172
|
+
return index;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
module.exports = {
|
|
178
|
+
command: 'ls [filter...]',
|
|
179
|
+
description: 'List all tasks sorted first by list then by priority',
|
|
180
|
+
action: action
|
|
181
|
+
};
|
package/src/cmd/lsd.js
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const df = require('dateformat');
|
|
4
|
+
const login = require('../utils/login.js');
|
|
5
|
+
const sort = require('../utils/sort.js');
|
|
6
|
+
const log = require('../utils/log.js');
|
|
7
|
+
const finish = require('../utils/finish.js');
|
|
8
|
+
const parseFilter = require('../utils/filter.js');
|
|
9
|
+
const config = require('../utils/config.js');
|
|
10
|
+
const printIndicator = require('../utils/printIndicator.js')
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* This command will display all of the User's tasks sorted first by list,
|
|
15
|
+
* then completed status, then priority, then due date.
|
|
16
|
+
*/
|
|
17
|
+
function action(args, env) {
|
|
18
|
+
let filter = parseFilter(args.length > 0 ? args[0].join(' ') : '');
|
|
19
|
+
|
|
20
|
+
// Get the authenticated User
|
|
21
|
+
config.user(function(user) {
|
|
22
|
+
|
|
23
|
+
// Start Spinner
|
|
24
|
+
log.spinner.start("Getting Tasks...");
|
|
25
|
+
|
|
26
|
+
// Get User Tasks
|
|
27
|
+
user.tasks.get(filter, function(err, tasks) {
|
|
28
|
+
if ( err ) {
|
|
29
|
+
log.spinner.error("Could not get tasks (" + err.msg + ")");
|
|
30
|
+
return finish();
|
|
31
|
+
}
|
|
32
|
+
else if ( tasks.length === 0 ) {
|
|
33
|
+
log.spinner.error("No tasks returned");
|
|
34
|
+
return finish();
|
|
35
|
+
}
|
|
36
|
+
log.spinner.stop();
|
|
37
|
+
|
|
38
|
+
// Get Display Styles
|
|
39
|
+
let styles = config.get().styles;
|
|
40
|
+
|
|
41
|
+
// Get max task number
|
|
42
|
+
tasks.sort(sort.tasks.index);
|
|
43
|
+
let MAX_INDEX = tasks[tasks.length-1].index;
|
|
44
|
+
|
|
45
|
+
// Sort Tasks
|
|
46
|
+
tasks.sort(sort.tasks.lsd);
|
|
47
|
+
|
|
48
|
+
// Last Due Date
|
|
49
|
+
let lastDue = undefined;
|
|
50
|
+
|
|
51
|
+
// Parse each task
|
|
52
|
+
for ( let i = 0; i < tasks.length; i++ ) {
|
|
53
|
+
let task = tasks[i];
|
|
54
|
+
let taskDue = task.due === undefined ? 0 : task.due.getDate();
|
|
55
|
+
let taskDueTime = task.due === undefined ? 0 : task.due.getTime();
|
|
56
|
+
|
|
57
|
+
// ==== PRINT DUE DATE ==== //
|
|
58
|
+
|
|
59
|
+
// Print New Due Date
|
|
60
|
+
if ( lastDue !== taskDue ) {
|
|
61
|
+
if ( lastDue !== undefined ) {
|
|
62
|
+
log();
|
|
63
|
+
}
|
|
64
|
+
// lastDue = task.due === undefined ? 0 : task.due.getTime();
|
|
65
|
+
lastDue = taskDue;
|
|
66
|
+
|
|
67
|
+
for ( let i = 0; i < MAX_INDEX.toString().length+1; i++ ) {
|
|
68
|
+
log(' ', false);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if ( task.due !== undefined ) {
|
|
72
|
+
log.style(df(task.due, config.get().dateformat), styles.due, true);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
log.style("No Due Date", styles.due, true);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
// ==== PRINT TASK INFORMATION ==== //
|
|
82
|
+
|
|
83
|
+
// Print Task Index
|
|
84
|
+
log.style(_pad(task.index, MAX_INDEX), styles.index);
|
|
85
|
+
log.style(' ');
|
|
86
|
+
|
|
87
|
+
// Print the Task Priority
|
|
88
|
+
let priStyle = '';
|
|
89
|
+
if ( !task.completed ) {
|
|
90
|
+
priStyle = styles.priority[task.priority.toString()];
|
|
91
|
+
if ( task.priority === 0 ) {
|
|
92
|
+
log.style(' ');
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
log.style('(' + task.priority + ')', priStyle);
|
|
96
|
+
log.style(' ');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
priStyle = styles.completed;
|
|
101
|
+
log.style(' ');
|
|
102
|
+
log.style('x', priStyle);
|
|
103
|
+
log.style(' ');
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Print the Task List Name
|
|
107
|
+
let listStyle = task.isCompleted ? styles.completed : styles.list;
|
|
108
|
+
log.style(task.list.name + ':', listStyle);
|
|
109
|
+
|
|
110
|
+
// Display subtask indicator
|
|
111
|
+
if (task.isSubtask) {
|
|
112
|
+
log.style(' ');
|
|
113
|
+
printIndicator('subtask',task);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Print the Task Name
|
|
117
|
+
log.style(' ');
|
|
118
|
+
log.style(task.name + ' ', priStyle);
|
|
119
|
+
|
|
120
|
+
// Print URL Indicator
|
|
121
|
+
if ( task.url !== undefined ) {
|
|
122
|
+
printIndicator('url',task);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Print Note Indicators
|
|
126
|
+
for ( let i = 0; i < task.notes.length; i++ ) {
|
|
127
|
+
printIndicator('notes',task);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Print recurring indicator
|
|
131
|
+
if (task.isRecurring) {
|
|
132
|
+
printIndicator('recurring',task);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Print Tags
|
|
136
|
+
let tagstyle = task.isCompleted ? styles.completed : styles.tags;
|
|
137
|
+
for ( let i = 0; i < task.tags.length; i++ ) {
|
|
138
|
+
log.style(' ');
|
|
139
|
+
log.style('#' + task.tags[i], tagstyle);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Print Completed Date or Due Time
|
|
143
|
+
if ( task.completed ) {
|
|
144
|
+
log.style(' ');
|
|
145
|
+
log.style('x', styles.completed);
|
|
146
|
+
log.style(' ');
|
|
147
|
+
log.style(df(task.completed, config.get().dateformat), styles.completed);
|
|
148
|
+
} else {
|
|
149
|
+
// Prints due time for incomplete tasks that have a time set
|
|
150
|
+
df(taskDueTime,'shortTime') != '12:00 AM' && taskDueTime!= 0
|
|
151
|
+
? log.style(' '+df(taskDueTime,'shortTime'),styles.due)
|
|
152
|
+
: null;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Finish line
|
|
156
|
+
log('');
|
|
157
|
+
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Finish
|
|
161
|
+
return finish();
|
|
162
|
+
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Pad the Index number with leading 0s
|
|
172
|
+
* @param index Task Index Number
|
|
173
|
+
* @param maxIndex Max Task Index
|
|
174
|
+
* @returns {string}
|
|
175
|
+
* @private
|
|
176
|
+
*/
|
|
177
|
+
function _pad(index, maxIndex) {
|
|
178
|
+
let max = maxIndex.toString().length;
|
|
179
|
+
let digits = index.toString().length;
|
|
180
|
+
let delta = max - digits;
|
|
181
|
+
for ( let i = 0; i < delta; i++ ) {
|
|
182
|
+
index = '0' + index;
|
|
183
|
+
}
|
|
184
|
+
return index;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
module.exports = {
|
|
190
|
+
command: 'lsd [filter...]',
|
|
191
|
+
description: 'List all tasks sorted first by due date then by priority',
|
|
192
|
+
action: action
|
|
193
|
+
};
|
package/src/cmd/lsp.js
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const df = require('dateformat');
|
|
4
|
+
const login = require('../utils/login.js');
|
|
5
|
+
const sort = require('../utils/sort.js');
|
|
6
|
+
const log = require('../utils/log.js');
|
|
7
|
+
const finish = require('../utils/finish.js');
|
|
8
|
+
const parseFilter = require('../utils/filter.js');
|
|
9
|
+
const config = require('../utils/config.js');
|
|
10
|
+
const styles = config.get().styles;
|
|
11
|
+
const printIndicator = require('../utils/printIndicator.js')
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* This command will display all of the User's tasks sorted first by priority,
|
|
16
|
+
* then due date.
|
|
17
|
+
*/
|
|
18
|
+
function action(args, env) {
|
|
19
|
+
let filter = parseFilter(args.length > 0 ? args[0].join(' ') : '');
|
|
20
|
+
|
|
21
|
+
// Get the authenticated User
|
|
22
|
+
config.user(function(user) {
|
|
23
|
+
|
|
24
|
+
// Start Spinner
|
|
25
|
+
log.spinner.start("Getting Tasks...");
|
|
26
|
+
|
|
27
|
+
// Get User Tasks
|
|
28
|
+
user.tasks.get(filter, function(err, tasks) {
|
|
29
|
+
if ( err ) {
|
|
30
|
+
log.spinner.error("Could not get tasks (" + err.msg + ")");
|
|
31
|
+
return finish();
|
|
32
|
+
}
|
|
33
|
+
else if ( tasks.length === 0 ) {
|
|
34
|
+
log.spinner.error("No tasks returned");
|
|
35
|
+
return finish();
|
|
36
|
+
}
|
|
37
|
+
log.spinner.stop();
|
|
38
|
+
|
|
39
|
+
// Get Display Styles
|
|
40
|
+
let styles = config.get().styles;
|
|
41
|
+
|
|
42
|
+
// Get max task number
|
|
43
|
+
tasks.sort(sort.tasks.index);
|
|
44
|
+
let MAX_INDEX = tasks[tasks.length-1].index;
|
|
45
|
+
|
|
46
|
+
// Sort Tasks
|
|
47
|
+
tasks.sort(sort.tasks.lsp);
|
|
48
|
+
|
|
49
|
+
// Parse each task
|
|
50
|
+
for ( let i = 0; i < tasks.length; i++ ) {
|
|
51
|
+
let task = tasks[i];
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
// ==== PRINT TASK INFORMATION ==== //
|
|
55
|
+
|
|
56
|
+
// Print Task Index
|
|
57
|
+
log.style(_pad(task.index, MAX_INDEX), styles.index);
|
|
58
|
+
log.style(' ');
|
|
59
|
+
|
|
60
|
+
// Print the Task Priority
|
|
61
|
+
let priStyle = '';
|
|
62
|
+
if ( !task.completed ) {
|
|
63
|
+
priStyle = styles.priority[task.priority.toString()];
|
|
64
|
+
if ( task.priority === 0 ) {
|
|
65
|
+
log.style(' ');
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
log.style('(' + task.priority + ')', priStyle);
|
|
69
|
+
log.style(' ');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
priStyle = styles.completed;
|
|
74
|
+
log.style(' ');
|
|
75
|
+
log.style('x', priStyle);
|
|
76
|
+
log.style(' ');
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Print the Task List Name
|
|
80
|
+
let listStyle = task.isCompleted ? styles.completed : styles.list;
|
|
81
|
+
log.style(task.list.name + ':', listStyle);
|
|
82
|
+
|
|
83
|
+
// Display subtask indicator
|
|
84
|
+
if (task.isSubtask) {
|
|
85
|
+
log.style(' ');
|
|
86
|
+
printIndicator('subtask',task);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Print the Task Name
|
|
90
|
+
log.style(' ');
|
|
91
|
+
log.style(task.name + ' ', priStyle);
|
|
92
|
+
|
|
93
|
+
// Print URL Indicator
|
|
94
|
+
if ( task.url !== undefined ) {
|
|
95
|
+
printIndicator('url',task);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Print Note Indicators
|
|
99
|
+
for ( let i = 0; i < task.notes.length; i++ ) {
|
|
100
|
+
printIndicator('notes',task);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Print recurring indicator
|
|
104
|
+
if (task.isRecurring) {
|
|
105
|
+
printIndicator('recurring',task);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Print Tags
|
|
109
|
+
let tagstyle = task.isCompleted ? styles.completed : styles.tags;
|
|
110
|
+
for ( let i = 0; i < task.tags.length; i++ ) {
|
|
111
|
+
log.style(' ');
|
|
112
|
+
log.style('#' + task.tags[i], tagstyle);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Print Due Date / Completed Date
|
|
116
|
+
if ( !task.isCompleted ) {
|
|
117
|
+
if ( task.due ) {
|
|
118
|
+
log.style(' ');
|
|
119
|
+
log.style('|', styles.due);
|
|
120
|
+
log.style(' ');
|
|
121
|
+
log.style(df(task.due, config.get().dateformat), styles.due);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
if ( task.completed ) {
|
|
126
|
+
log.style(' ');
|
|
127
|
+
log.style('x', styles.completed);
|
|
128
|
+
log.style(' ');
|
|
129
|
+
log.style(df(task.completed, config.get().dateformat), styles.completed);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Finish line
|
|
134
|
+
log('');
|
|
135
|
+
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Finish
|
|
139
|
+
return finish();
|
|
140
|
+
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Pad the Index number with leading 0s
|
|
150
|
+
* @param index Task Index Number
|
|
151
|
+
* @param maxIndex Max Task Index
|
|
152
|
+
* @returns {string}
|
|
153
|
+
* @private
|
|
154
|
+
*/
|
|
155
|
+
function _pad(index, maxIndex) {
|
|
156
|
+
let max = maxIndex.toString().length;
|
|
157
|
+
let digits = index.toString().length;
|
|
158
|
+
let delta = max - digits;
|
|
159
|
+
for ( let i = 0; i < delta; i++ ) {
|
|
160
|
+
index = '0' + index;
|
|
161
|
+
}
|
|
162
|
+
return index;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
module.exports = {
|
|
168
|
+
command: 'lsp [filter...]',
|
|
169
|
+
description: 'List all tasks sorted first by priority then due date',
|
|
170
|
+
action: action
|
|
171
|
+
};
|
package/src/cmd/move.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const log = require('../utils/log.js');
|
|
4
|
+
const config = require('../utils/config.js');
|
|
5
|
+
const { prompt } = require('../utils/prompt.js');
|
|
6
|
+
|
|
7
|
+
const finish = require('../utils/finish.js');
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* This command moves the Task to a different list
|
|
12
|
+
* @param args index list
|
|
13
|
+
* @param env
|
|
14
|
+
*/
|
|
15
|
+
function action(args, env) {
|
|
16
|
+
|
|
17
|
+
// Prompt for List
|
|
18
|
+
if ( args.length < 2 ) {
|
|
19
|
+
prompt('Task:', 'List:', _promptFinished);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Use provided args
|
|
23
|
+
else {
|
|
24
|
+
_process(args[0], args[1].join(' '));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Process the returned answers
|
|
32
|
+
* @private
|
|
33
|
+
*/
|
|
34
|
+
function _promptFinished(answers) {
|
|
35
|
+
for ( let i = 0; i < answers.length; i++ ) {
|
|
36
|
+
let answer = answers[i];
|
|
37
|
+
_process(answer[0], answer[1], i+1, answers.length);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Process the request
|
|
44
|
+
* @private
|
|
45
|
+
*/
|
|
46
|
+
function _process(task, list, count=1, max=1) {
|
|
47
|
+
log.spinner.start("Moving Task(s)...");
|
|
48
|
+
config.user(function(user) {
|
|
49
|
+
|
|
50
|
+
// Parse arguments
|
|
51
|
+
task = parseInt(task.trim());
|
|
52
|
+
list = list.trim();
|
|
53
|
+
|
|
54
|
+
// Set Name
|
|
55
|
+
user.tasks.move(task, list, function(err) {
|
|
56
|
+
if ( err ) {
|
|
57
|
+
log.spinner.error("Could not move Task #" + task + " (" + err.msg + ")");
|
|
58
|
+
}
|
|
59
|
+
_processFinished(count, max);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Request Callback
|
|
67
|
+
* @private
|
|
68
|
+
*/
|
|
69
|
+
function _processFinished(count, max) {
|
|
70
|
+
log.spinner.start("Moving Task [" + count + "/" + max + "]...");
|
|
71
|
+
if ( count === max ) {
|
|
72
|
+
log.spinner.success("Task(s) Moved");
|
|
73
|
+
return finish();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
module.exports = {
|
|
79
|
+
command: 'move [index] [list...]',
|
|
80
|
+
alias: 'mv',
|
|
81
|
+
description: 'Move Task to a different List',
|
|
82
|
+
action: action
|
|
83
|
+
};
|