· 5 years ago · Feb 14, 2020, 11:36 AM
1const program = require('commander');
2const shell = require('shelljs');
3const inquirer = require('inquirer');
4const colors = require('colors/safe');
5const figlet = require('figlet');
6
7var Trello = require("trello");
8var trello = new Trello(apiKey, oauthToken);
9
10(async () => {
11 await main()
12 // await moveCard()
13
14})();
15
16
17async function main() {
18
19 let state = await init()
20
21 while (true) {
22 state = await getNextChecklistAction(state)
23 }
24
25}
26
27async function init() {
28 const card = await selectCard()
29 const checklist = await selectChecklist(card)
30
31 const state = {
32 card,
33 checklist
34 }
35
36 printChecklistNicely(checklist)
37 printCardNicely(card)
38
39 return state
40}
41
42async function getNextChecklistAction(state) {
43 const ADD_ITEM = 'Add item'
44 const SELECT_CHECKLIST = 'Select checklist'
45 const SELECT_CARD = 'Select card'
46 const MOVE_CARD = 'Move card'
47 const actions = [
48 {
49 name: ADD_ITEM
50 },
51 {
52 name: SELECT_CHECKLIST
53 },
54 {
55 name: SELECT_CARD
56 },
57 {
58 name: MOVE_CARD
59 },
60 ]
61 const ans = await askUserForAction(actions)
62
63 switch (ans.name) {
64 case ADD_ITEM:
65 await addItem(state.checklist)
66 break
67 case SELECT_CHECKLIST:
68 if (!card) {
69 console.log('Please select card first.')
70 return
71 }
72 state.checklist = await selectChecklist(state.card)
73 printChecklistNicely(state.checklist)
74 printCardNicely(state.card)
75 break
76 case SELECT_CARD:
77 state.card = await selectCard()
78 state.checklist = await selectChecklist(state.card)
79 printChecklistNicely(state.checklist)
80 printCardNicely(state.card)
81 break
82 case MOVE_CARD:
83 await moveCard(state.card)
84 break
85
86 default:
87
88 break
89 }
90
91 return state
92}
93
94async function selectChecklist(card) {
95 const checklists = await getChecklistsFromCardId(card.id)
96 checklist = await showChecklistChoosingDialog(checklists)
97 return checklist
98}
99
100async function selectCard() {
101 const rndBoardId = 'asdasdasdasd'
102 const tomMemberId = 'aasdasd'
103 const cards = await getCards(rndBoardId, tomMemberId)
104 const card = await showCardsChoosingDialog(cards)
105 return card
106}
107
108async function moveCard(card) {
109 const cardslist = await askUserForCardsList(cardslists)
110 let res = await updateCardList(card.id, cardslist.id)
111 console.log('Card moved.')
112}
113
114async function askUserForAction(actions) {
115 return await askUserToChooseFromList(actions, 'Choose Action:')
116}
117
118async function askUserForCardsList(cardslist) {
119 return await askUserToChooseFromList(cardslist, 'Choose Cardlist:')
120}
121
122function printCardNicely(card) {
123 const filteredCardlists = cardslists.filter(cardlist => {
124 return cardlist.id === card.idList
125 })
126
127 if(!filteredCardlists[0]) {
128 console.log(`${card.name}`)
129 return
130 }
131 const cardlistName = filteredCardlists[0].name
132
133 console.log(`${cardlistName}: ${card.name}`)
134}
135
136async function printChecklistNicely(checklist) {
137 const checkItems = checklist.checkItems
138 for (item of checkItems) {
139 if (item.state === 'incomplete') {
140 console.log(colors.green(item.name))
141 }
142 else {
143 console.log(colors.red.underline(item.name))
144 }
145 }
146
147}
148
149async function askUserForTextInput(promptText) {
150 const ans = await inquirer.prompt([
151 {
152 type: 'input',
153 message: promptText,
154 name: 'input',
155 }])
156
157 return ans['input']
158}
159
160async function addItem(checklist) {
161 const input = await askUserForTextInput()
162 await addItemToChecklist(checklist.id, input)
163
164}
165
166async function addItemToChecklist(checklistId, itemText) {
167
168 return new Promise((resolve, reject) => {
169 trello.addItemToChecklist(checklistId, itemText, 0, (err, data) => {
170 if (err) {
171 reject(err)
172 }
173 resolve(data)
174 })
175 })
176}
177
178async function getChecklistsFromCardId(cardId) {
179
180 return new Promise((resolve, reject) => {
181 trello.getChecklistsOnCard(cardId, (err, data) => {
182 if (err) {
183 reject(err)
184 }
185 resolve(data)
186 })
187 })
188}
189
190async function showChecklistChoosingDialog(checklists) {
191 return await askUserToChooseFromList(checklists, 'Choose Checklist:')
192}
193
194async function showCardsChoosingDialog(cards) {
195 return await askUserToChooseFromList(cards, 'Choose Card:')
196}
197
198async function askUserToChooseFromList(list, promptText) {
199 const ans = await inquirer.prompt([
200 {
201 type: 'list',
202 message: promptText,
203 name: 'selection',
204 choices: list,
205 }])
206
207 const selectedItem = list.filter((item) => {
208 return item.name === ans.selection
209 })
210
211 return selectedItem[0]
212}
213
214
215async function getCards(boardId, memeberId) {
216 let cards = await getCardsOnBoard(boardId)
217 cards = mapNeededFieldsFromCard(cards)
218 cards = filterCardsByMemberId(cards, memeberId)
219 cards = sortCardsByDate(cards)
220
221 return cards
222}
223
224function filterCardsByMemberId(cards, memeberId) {
225 return cards.filter((card) => {
226 if (isCardHaveThisMemeberId(card, memeberId)) {
227 return true
228 }
229 return false
230 })
231}
232
233function isCardHaveThisMemeberId(card, memeberId) {
234 return card.idMembers.indexOf(memeberId) > -1
235}
236
237async function getCardsOnBoard(boardId) {
238
239 return new Promise((resolve, reject) => {
240 trello.getCardsOnBoard(boardId, (err, data) => {
241 if (err) {
242 reject(err)
243 }
244 resolve(data)
245 })
246 })
247}
248
249async function updateCardList(cardId, newListId) {
250 return new Promise((resolve, reject) => {
251 trello.updateCardList(cardId, newListId, (err, data) => {
252 if (err) {
253 reject(err)
254 }
255 resolve(data)
256 })
257 })
258}
259
260async function getListsOnBoard(boardId) {
261
262 return new Promise((resolve, reject) => {
263 trello.getListsOnBoard(boardId, (err, data) => {
264 if (err) {
265 reject(err)
266 }
267 resolve(data)
268 })
269 })
270}
271
272function mapNeededFieldsFromCard(cards) {
273 const modifiedCards = cards.map((card) => {
274
275 return {
276 id: card.id,
277 name: card.name,
278 idMembers: card.idMembers,
279 dateLastActivity: card.dateLastActivity,
280 idList: card.idList,
281 timestampLastActivity: getTimestampFromDate(card.dateLastActivity)
282 }
283 })
284
285 return modifiedCards
286}
287
288function sortCardsByDate(cards) {
289 return sortArrayByTimestampField(cards, 'timestampLastActivity')
290}
291
292function sortArrayByTimestampField(arr, timestampField) {
293 return arr.sort((a, b) => b[timestampField] - a[timestampField])
294}
295
296function getTimestampFromDate(date) {
297 return new Date(date).getTime()
298}
299
300
301async function run() {
302
303 console.log(figlet.textSync('brch', {
304 font: 'Big Money-ne',
305 horizontalLayout: 'default',
306 verticalLayout: 'default'
307 }));
308
309
310 const res = shell.exec('git branch', { silent: true })
311 const branchs = res.replace(" ", "").trim().split("\n")
312
313 let currentBranch = null
314 let otherBranches = []
315 for (brn of branchs) {
316 if (brn.indexOf("*") >= 0) {
317 currentBranch = brn
318 currentBranch = currentBranch.replace("*", "")
319 } else {
320 otherBranches.push({ name: brn })
321 }
322 }
323
324
325 console.log('On branch: ', currentBranch)
326 console.log('**********************************')
327 const ans = await inquirer.prompt([
328 {
329 type: 'checkbox',
330 message: 'Select branch',
331 name: 'branchs',
332 choices: otherBranches
333 }])
334 console.log('**********************************')
335 shell.exec('git checkout ' + ans.branchs[0], { silent: true })
336 shell.exec('git branch ')
337
338}
339
340// program
341 // .option('-d, --debug', 'output extra debugging')
342 // .option('-s, --small', 'small pizza size')
343 // .option('-p, --pizza-type <type>', 'flavour of pizza')
344
345 // program.parse(process.argv)
346
347 // if (program.debug) console.log(program.opts())
348 // console.log('pizza details:')
349 // if (program.small) console.log('- small pizza size')
350 // if (program.pizzaType) console.log(`- ${program.pizzaType}`)
351
352
353 // Running...