@@ -39,6 +39,8 @@ const (
3939type Model struct {
4040 notifierCmdbar * cmdbar.NotifierCmdBar
4141 record * kadmin.ConsumerRecord
42+ records []kadmin.ConsumerRecord
43+ recordIndex int
4244 recordVp * viewport.Model
4345 headerValueVp * viewport.Model
4446 topicName string
@@ -68,6 +70,12 @@ type CopyErrorMsg struct {
6870 Err error
6971}
7072
73+ type NavigateToNextRecordMsg struct {
74+ }
75+
76+ type NavigateToPrevRecordMsg struct {
77+ }
78+
7179func (m * Model ) View (ktx * kontext.ProgramKtx , renderer * ui.Renderer ) string {
7280
7381 notifierCmdbarView := m .notifierCmdbar .View (ktx , renderer )
@@ -102,6 +110,10 @@ func (m *Model) Update(msg tea.Msg) tea.Cmd {
102110 switch msg .String () {
103111 case "esc" :
104112 return ui .PublishMsg (nav.LoadCachedConsumptionPageMsg {})
113+ case "ctrl+n" :
114+ cmds = m .handleNavigateToNext (cmds )
115+ case "ctrl+p" :
116+ cmds = m .handleNavigateToPrev (cmds )
105117 case "h" , "left" , "right" :
106118 if len (m .record .Headers ) >= 1 {
107119 m .focus = ! m .focus
@@ -117,6 +129,10 @@ func (m *Model) Update(msg tea.Msg) tea.Cmd {
117129 default :
118130 cmds = m .updatedFocussedArea (msg , cmds )
119131 }
132+ case NavigateToNextRecordMsg :
133+ cmds = m .loadRecordAtIndex (m .recordIndex + 1 , cmds )
134+ case NavigateToPrevRecordMsg :
135+ cmds = m .loadRecordAtIndex (m .recordIndex - 1 , cmds )
120136 }
121137
122138 return tea .Batch (cmds ... )
@@ -274,6 +290,66 @@ func (m *Model) handleCopy(cmds []tea.Cmd) []tea.Cmd {
274290 return cmds
275291}
276292
293+ func (m * Model ) handleNavigateToNext (cmds []tea.Cmd ) []tea.Cmd {
294+ if m .recordIndex >= len (m .records )- 1 {
295+ m .notifierCmdbar .Notifier .ShowError (fmt .Errorf ("no more records" ))
296+ return cmds
297+ }
298+ cmds = append (cmds , ui .PublishMsg (NavigateToNextRecordMsg {}))
299+ return cmds
300+ }
301+
302+ func (m * Model ) handleNavigateToPrev (cmds []tea.Cmd ) []tea.Cmd {
303+ if m .recordIndex <= 0 {
304+ m .notifierCmdbar .Notifier .ShowError (fmt .Errorf ("no previous records" ))
305+ return cmds
306+ }
307+ cmds = append (cmds , ui .PublishMsg (NavigateToPrevRecordMsg {}))
308+ return cmds
309+ }
310+
311+ func (m * Model ) loadRecordAtIndex (index int , cmds []tea.Cmd ) []tea.Cmd {
312+ if index < 0 || index >= len (m .records ) {
313+ return cmds
314+ }
315+ m .record = & m .records [index ]
316+ m .recordIndex = index
317+ m .resetViews ()
318+ m .rebuildHeaderRows ()
319+ m .updateMetaInfo ()
320+ return cmds
321+ }
322+
323+ func (m * Model ) rebuildHeaderRows () {
324+ sort .SliceStable (m .record .Headers , func (i , j int ) bool {
325+ return m .record .Headers [i ].Key < m .record .Headers [j ].Key
326+ })
327+ m .headerRows = nil
328+ for _ , header := range m .record .Headers {
329+ m .headerRows = append (m .headerRows , table.Row {header .Key })
330+ }
331+ }
332+
333+ func (m * Model ) resetViews () {
334+ m .recordVp = nil
335+ m .schemaVp = nil
336+ }
337+
338+ func (m * Model ) updateMetaInfo () {
339+ key := m .record .Key
340+ if key == "" {
341+ key = "<null>"
342+ }
343+ m .metaInfo = fmt .Sprintf ("key: %s\n timestamp: %s" , key , m .record .Timestamp .Format (time .UnixDate ))
344+ if m .record .Err != nil {
345+ m .err = m .record .Err
346+ m .notifierCmdbar .Notifier .ShowError (m .record .Err )
347+ } else {
348+ m .err = nil
349+ m .payload = ui .PrettyPrintJson (m .record .Payload .Value )
350+ }
351+ }
352+
277353func (m * Model ) updatedFocussedArea (msg tea.Msg , cmds []tea.Cmd ) []tea.Cmd {
278354 // only update the component if no error is present
279355 if m .err != nil {
@@ -314,6 +390,13 @@ func (m *Model) Shortcuts() []statusbar.Shortcut {
314390 {"Copy " + whatToCopy , "c" },
315391 }
316392
393+ if len (m .records ) > 1 {
394+ shortcuts = append (shortcuts , []statusbar.Shortcut {
395+ {"Next Record" , "ctrl+n" },
396+ {"Prev Record" , "ctrl+p" },
397+ }... )
398+ }
399+
317400 if m .config .ActiveCluster ().HasSchemaRegistry () && m .focus == mainViewFocus {
318401 shortcuts = append (shortcuts , statusbar.Shortcut {
319402 Name : "Toggle Record/Schema" ,
@@ -337,6 +420,8 @@ func (m *Model) Title() string {
337420func New (
338421 record * kadmin.ConsumerRecord ,
339422 topicName string ,
423+ records []kadmin.ConsumerRecord ,
424+ recordIndex int ,
340425 clipWriter clipper.Writer ,
341426 ktx * kontext.ProgramKtx ,
342427) * Model {
@@ -402,6 +487,8 @@ func New(
402487
403488 return & Model {
404489 record : record ,
490+ records : records ,
491+ recordIndex : recordIndex ,
405492 topicName : topicName ,
406493 headerKeyTable : & headersTable ,
407494 focus : mainViewFocus ,
0 commit comments