diff --git a/tools/asynq/cmd/dash/key_event.go b/tools/asynq/cmd/dash/key_event.go index 4a331a8..0ed57e4 100644 --- a/tools/asynq/cmd/dash/key_event.go +++ b/tools/asynq/cmd/dash/key_event.go @@ -107,7 +107,7 @@ func (h *keyEventHandler) downKeyQueueDetails() { } else { state.groupTableRowIdx = 0 // loop back } - } else { + } else if state.taskID == "" { if state.taskTableRowIdx < len(state.tasks) { state.taskTableRowIdx++ } else { @@ -144,7 +144,7 @@ func (h *keyEventHandler) upKeyQueueDetails() { } else { state.groupTableRowIdx-- } - } else { + } else if state.taskID == "" { if state.taskTableRowIdx == 0 { state.taskTableRowIdx = len(state.tasks) } else { @@ -215,7 +215,7 @@ func (h *keyEventHandler) handleLeftKey() { f = h.fetcher d = h.drawer ) - if state.view == viewTypeQueueDetails { + if state.view == viewTypeQueueDetails && state.taskID == "" { state.taskState = prevTaskState(state.taskState) state.pageNum = 1 state.taskTableRowIdx = 0 @@ -233,7 +233,7 @@ func (h *keyEventHandler) handleRightKey() { f = h.fetcher d = h.drawer ) - if state.view == viewTypeQueueDetails { + if state.view == viewTypeQueueDetails && state.taskID == "" { state.taskState = nextTaskState(state.taskState) state.pageNum = 1 state.taskTableRowIdx = 0 diff --git a/tools/asynq/cmd/dash/key_event_test.go b/tools/asynq/cmd/dash/key_event_test.go index f84ca45..cb60ab9 100644 --- a/tools/asynq/cmd/dash/key_event_test.go +++ b/tools/asynq/cmd/dash/key_event_test.go @@ -164,6 +164,48 @@ func TestKeyEventHandler(t *testing.T) { taskID: "", // this field should be unset }, }, + { + desc: "Arrow keys are disabled while task info modal is open", + 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.KeyLeft, ' ', tcell.ModNone), + }, + + // no change + 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: "yyyy", // presence of this field opens the modal + }, + }, // TODO: Add more tests }