diff --git a/cmdasana.py b/cmdasana.py index 3627929..0c3ece2 100755 --- a/cmdasana.py +++ b/cmdasana.py @@ -36,8 +36,10 @@ class CmdAsana: def updateTask(self, task_id, name): self.client.tasks.update(task_id, name=name) - - def showDetails(self, task_id): pass + + def addComment(self, task_id, comment): + self.client.stories.create_on_task(task_id, {"text": comment}) + self.loadDetails(task_id) def replaceBody(self, widget): old_widget,_ = self.frame.contents.pop() @@ -51,29 +53,46 @@ class CmdAsana: self.replaceBody(task_list) self.workspace_id = workspace_id + def loadDetails(self, task_id): + task = self.client.tasks.find_by_id(task_id) + stories = self.client.stories.find_by_task(task_id) + task_details = ui.TaskDetails(task, stories) + urwid.connect_signal(task_details, 'comment', self.addComment) + self.replaceBody(task_details) + def refreshTaskList(self): self.showWorkspace(self.workspace_id) def registerSignals(self): - urwid.register_signal(ui.TaskList, - ['complete', - 'newtask', - 'updatetask']) - urwid.register_signal(ui.TaskEdit, - ['complete', - 'newtask', - 'updatetask']) + urwid.register_signal(ui.TaskList, [ + 'complete', + 'newtask', + 'updatetask', + 'details' + ]) + urwid.register_signal(ui.TaskEdit, [ + 'complete', + 'newtask', + 'updatetask', + 'details' + ]) + + urwid.register_signal(ui.TaskDetails, ['comment']) + urwid.register_signal(ui.CommentEdit, ['comment']) + urwid.register_signal(ui.WorkspaceMenu, 'click') def clearSignals(self, widget): urwid.disconnect_signal(widget, 'complete', self.completeTask) urwid.disconnect_signal(widget, 'newtask', self.newTask) urwid.disconnect_signal(widget, 'updatetask', self.updateTask) + urwid.disconnect_signal(widget, 'details', self.loadDetails) def connectTaskListSignals(self, task_list): urwid.connect_signal(task_list, 'complete', self.completeTask) urwid.connect_signal(task_list, 'newtask', self.newTask) urwid.connect_signal(task_list, 'updatetask', self.updateTask) + urwid.connect_signal(task_list, 'details', self.loadDetails) def handleInput(self, key): if key in ('q', 'Q'): diff --git a/ui.py b/ui.py index 7983a5e..b101263 100644 --- a/ui.py +++ b/ui.py @@ -8,6 +8,7 @@ LIST = 'list' palette = [ ('selected', 'standout', ''), ('selected workspace', 'standout,bold', ''), + ('header', 'bold', ''), ] class WorkspaceMenu(urwid.Columns): @@ -47,23 +48,25 @@ class TaskList(urwid.ListBox): body = urwid.SimpleFocusListWalker([]) for task_widget,_ in task_widgets.contents: - urwid.connect_signal(task_widget, 'complete', self.completeTask) - urwid.connect_signal(task_widget, 'newtask', self.newTask) - urwid.connect_signal(task_widget, 'updatetask', self.updateTask) + self.connectSignals(task_widget) body.append(urwid.AttrMap(task_widget, None, focus_map='selected')) super(TaskList, self).__init__(body) def insertNewTask(self, task): task_widget = TaskEdit(task, mode=EDIT) - urwid.connect_signal(task_widget, 'complete', self.completeTask) - urwid.connect_signal(task_widget, 'newtask', self.newTask) - urwid.connect_signal(task_widget, 'updatetask', self.updateTask) + self.connectSignals(task_widget) index = self.focus_position + 1 self.body.insert(index, urwid.AttrMap(task_widget, None, focus_map='selected')) self.focus_position += 1 + def connectSignals(self, task_widget): + urwid.connect_signal(task_widget, 'complete', self.completeTask) + urwid.connect_signal(task_widget, 'newtask', self.newTask) + urwid.connect_signal(task_widget, 'updatetask', self.updateTask) + urwid.connect_signal(task_widget, 'details', self.details) + def completeTask(self, task_id): urwid.emit_signal(self, 'complete', task_id) del self.body[self.focus_position] @@ -73,7 +76,9 @@ class TaskList(urwid.ListBox): def updateTask(self, task_id, name): urwid.emit_signal(self, 'updatetask', task_id, name) - + + def details(self, task_id): + urwid.emit_signal(self, 'details', task_id) def keypress(self, size, key): # The ListBox will handle scrolling for us, so we trick it into thinking @@ -122,6 +127,43 @@ class TaskEdit(urwid.Edit): elif key == 'enter': urwid.emit_signal(self, 'newtask') elif key == 'l': - pass + urwid.emit_signal(self, 'details', self.task['id']) else: return key + +class CommentEdit(urwid.Edit): + def __init__(self, task): + self.task = task + super(CommentEdit, self).__init__('Add a comment:\n') + + def keypress(self, size, key): + if key != 'enter': + return super(CommentEdit, self).keypress(size, key) + urwid.emit_signal(self, 'comment', self.task['id'], self.edit_text) + +class TaskDetails(urwid.Pile): + def __init__(self, task, stories): + self.task = task + self.stories = stories + + comment_edit = CommentEdit(task) + urwid.connect_signal(comment_edit, 'comment', self.comment) + + body = [('pack', urwid.Text(project['name'])) + for project in task['projects']] + \ + [ + ('pack', urwid.Divider('=')), + ('pack', urwid.Text(('header', task['name']))), + ('pack', urwid.Divider('-')), + ('pack', urwid.Text(task['notes'])), + ] + \ + [('pack', urwid.Text('[' + story['created_by']['name'] + '] ' + \ + story['text'])) for story in stories] + \ + [ + ('weight', 1, urwid.Filler(comment_edit, 'bottom')) + ] + + super(TaskDetails, self).__init__(body) + + def comment(self, task_id, comment): + urwid.emit_signal(self, 'comment', task_id, comment)