mirror of
https://github.com/hibiken/asynq.git
synced 2025-10-03 17:22:01 +08:00
(cli): Show task info modal if taskID state is set
This commit is contained in:
@@ -37,6 +37,7 @@ type State struct {
|
|||||||
taskTableRowIdx int // highlighted row in task table
|
taskTableRowIdx int // highlighted row in task table
|
||||||
groupTableRowIdx int // highlighted row in group table
|
groupTableRowIdx int // highlighted row in group table
|
||||||
taskState asynq.TaskState // highlighted task state in queue details view
|
taskState asynq.TaskState // highlighted task state in queue details view
|
||||||
|
taskID string // selected task ID
|
||||||
|
|
||||||
selectedQueue *asynq.QueueInfo // queue shown on queue details view
|
selectedQueue *asynq.QueueInfo // queue shown on queue details view
|
||||||
selectedGroup *asynq.GroupInfo
|
selectedGroup *asynq.GroupInfo
|
||||||
|
@@ -442,6 +442,9 @@ func drawTaskStateBreakdown(d *ScreenDrawer, style tcell.Style, state *State) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func drawTaskModal(d *ScreenDrawer, state *State) {
|
func drawTaskModal(d *ScreenDrawer, state *State) {
|
||||||
|
if state.taskID == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
contents := []*rowContent{
|
contents := []*rowContent{
|
||||||
{" === Task Summary ===", baseStyle.Bold(true)},
|
{" === Task Summary ===", baseStyle.Bold(true)},
|
||||||
{"", baseStyle},
|
{"", baseStyle},
|
||||||
|
@@ -71,8 +71,15 @@ func (h *keyEventHandler) goBack() {
|
|||||||
state.view = state.prevView // exit help
|
state.view = state.prevView // exit help
|
||||||
d.draw(state)
|
d.draw(state)
|
||||||
} else if state.view == viewTypeQueueDetails {
|
} else if state.view == viewTypeQueueDetails {
|
||||||
|
// if task modal is open close it; otherwise go back to the previous view
|
||||||
|
if state.taskID != "" {
|
||||||
|
state.taskID = ""
|
||||||
|
state.selectedTask = nil
|
||||||
|
d.draw(state)
|
||||||
|
} else {
|
||||||
state.view = viewTypeQueues
|
state.view = viewTypeQueues
|
||||||
d.draw(state)
|
d.draw(state)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
h.quit()
|
h.quit()
|
||||||
}
|
}
|
||||||
@@ -191,7 +198,14 @@ func (h *keyEventHandler) enterKeyQueueDetails() {
|
|||||||
state.pageNum = 1
|
state.pageNum = 1
|
||||||
f.fetchAggregatingTasks(state.selectedQueue.Queue, state.selectedGroup.Group, taskPageSize(s), state.pageNum)
|
f.fetchAggregatingTasks(state.selectedQueue.Queue, state.selectedGroup.Group, taskPageSize(s), state.pageNum)
|
||||||
d.draw(state)
|
d.draw(state)
|
||||||
|
} else if !shouldShowGroupTable(state) && state.taskTableRowIdx != 0 {
|
||||||
|
task := state.tasks[state.taskTableRowIdx-1]
|
||||||
|
state.taskID = task.ID
|
||||||
|
state.selectedTask = task
|
||||||
|
// TODO: go fetch task info
|
||||||
|
d.draw(state)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *keyEventHandler) handleLeftKey() {
|
func (h *keyEventHandler) handleLeftKey() {
|
||||||
|
@@ -78,6 +78,87 @@ func TestKeyEventHandler(t *testing.T) {
|
|||||||
queueTableRowIdx: 0,
|
queueTableRowIdx: 0,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
desc: "opens task info modal",
|
||||||
|
state: &State{
|
||||||
|
view: viewTypeQueueDetails,
|
||||||
|
queues: []*asynq.QueueInfo{
|
||||||
|
{Queue: "default", Size: 500, Active: 10, Pending: 40},
|
||||||
|
},
|
||||||
|
queueTableRowIdx: 1,
|
||||||
|
selectedQueue: &asynq.QueueInfo{Queue: "default", Size: 50, Active: 10, Pending: 40},
|
||||||
|
taskState: asynq.TaskStatePending,
|
||||||
|
pageNum: 1,
|
||||||
|
tasks: []*asynq.TaskInfo{
|
||||||
|
{ID: "xxxx", Type: "foo"},
|
||||||
|
{ID: "yyyy", Type: "bar"},
|
||||||
|
{ID: "zzzz", Type: "baz"},
|
||||||
|
},
|
||||||
|
taskTableRowIdx: 2,
|
||||||
|
},
|
||||||
|
events: []*tcell.EventKey{
|
||||||
|
tcell.NewEventKey(tcell.KeyEnter, '\n', tcell.ModNone), // Enter
|
||||||
|
},
|
||||||
|
wantState: State{
|
||||||
|
view: viewTypeQueueDetails,
|
||||||
|
queues: []*asynq.QueueInfo{
|
||||||
|
{Queue: "default", Size: 500, Active: 10, Pending: 40},
|
||||||
|
},
|
||||||
|
queueTableRowIdx: 1,
|
||||||
|
selectedQueue: &asynq.QueueInfo{Queue: "default", Size: 50, Active: 10, Pending: 40},
|
||||||
|
taskState: asynq.TaskStatePending,
|
||||||
|
pageNum: 1,
|
||||||
|
tasks: []*asynq.TaskInfo{
|
||||||
|
{ID: "xxxx", Type: "foo"},
|
||||||
|
{ID: "yyyy", Type: "bar"},
|
||||||
|
{ID: "zzzz", Type: "baz"},
|
||||||
|
},
|
||||||
|
taskTableRowIdx: 2,
|
||||||
|
// new states
|
||||||
|
taskID: "yyyy",
|
||||||
|
selectedTask: &asynq.TaskInfo{ID: "yyyy", Type: "bar"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "Esc closes task info modal",
|
||||||
|
state: &State{
|
||||||
|
view: viewTypeQueueDetails,
|
||||||
|
queues: []*asynq.QueueInfo{
|
||||||
|
{Queue: "default", Size: 500, Active: 10, Pending: 40},
|
||||||
|
},
|
||||||
|
queueTableRowIdx: 1,
|
||||||
|
selectedQueue: &asynq.QueueInfo{Queue: "default", Size: 50, Active: 10, Pending: 40},
|
||||||
|
taskState: asynq.TaskStatePending,
|
||||||
|
pageNum: 1,
|
||||||
|
tasks: []*asynq.TaskInfo{
|
||||||
|
{ID: "xxxx", Type: "foo"},
|
||||||
|
{ID: "yyyy", Type: "bar"},
|
||||||
|
{ID: "zzzz", Type: "baz"},
|
||||||
|
},
|
||||||
|
taskTableRowIdx: 2,
|
||||||
|
taskID: "yyyy", // presence of this field opens the modal
|
||||||
|
},
|
||||||
|
events: []*tcell.EventKey{
|
||||||
|
tcell.NewEventKey(tcell.KeyEscape, ' ', tcell.ModNone), // Esc
|
||||||
|
},
|
||||||
|
wantState: State{
|
||||||
|
view: viewTypeQueueDetails,
|
||||||
|
queues: []*asynq.QueueInfo{
|
||||||
|
{Queue: "default", Size: 500, Active: 10, Pending: 40},
|
||||||
|
},
|
||||||
|
queueTableRowIdx: 1,
|
||||||
|
selectedQueue: &asynq.QueueInfo{Queue: "default", Size: 50, Active: 10, Pending: 40},
|
||||||
|
taskState: asynq.TaskStatePending,
|
||||||
|
pageNum: 1,
|
||||||
|
tasks: []*asynq.TaskInfo{
|
||||||
|
{ID: "xxxx", Type: "foo"},
|
||||||
|
{ID: "yyyy", Type: "bar"},
|
||||||
|
{ID: "zzzz", Type: "baz"},
|
||||||
|
},
|
||||||
|
taskTableRowIdx: 2,
|
||||||
|
taskID: "", // this field should be unset
|
||||||
|
},
|
||||||
|
},
|
||||||
// TODO: Add more tests
|
// TODO: Add more tests
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user