in pkg/selector/outputs/bubbletea.go [74:184]
func (m BubbleTeaModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg := msg.(type) {
case tea.KeyMsg:
// don't listen for input if currently typing into text field
if m.tableModel.filterTextInput.Focused() {
break
} else if m.sortingModel.sortTextInput.Focused() {
// see if we should sort and switch states to table
if m.currentState == stateSorting && msg.String() == "enter" {
jsonPath := m.sortingModel.sortTextInput.Value()
sortDirection := sorter.SortAscending
if m.sortingModel.isDescending {
sortDirection = sorter.SortDescending
}
var err error
m.tableModel, err = m.tableModel.sortTable(jsonPath, sortDirection)
if err != nil {
m.sortingModel.sortTextInput.SetValue(jsonPathError)
break
}
m.currentState = stateTable
m.sortingModel.sortTextInput.Blur()
}
break
}
// check for quit or change in state
switch msg.String() {
case "ctrl+c", "q":
return m, tea.Quit
case "e":
// switch from table state to verbose state
if m.currentState == stateTable {
// get focused instance type
focusedRow := m.tableModel.table.HighlightedRow()
focusedInstance, ok := focusedRow.Data[instanceTypeKey].(*instancetypes.Details)
if !ok {
break
}
// set content of view
m.verboseModel.focusedInstanceName = focusedInstance.InstanceType
m.verboseModel.viewport.SetContent(VerboseInstanceTypeOutput([]*instancetypes.Details{focusedInstance})[0])
// move viewport to top of printout
m.verboseModel.viewport.SetYOffset(0)
// switch from table state to verbose state
m.currentState = stateVerbose
}
case "s":
// switch from table view to sorting view
if m.currentState == stateTable {
m.currentState = stateSorting
}
case "enter":
// sort and switch states to table
if m.currentState == stateSorting {
sortFilter := string(m.sortingModel.shorthandList.SelectedItem().(item))
sortDirection := sorter.SortAscending
if m.sortingModel.isDescending {
sortDirection = sorter.SortDescending
}
var err error
m.tableModel, err = m.tableModel.sortTable(sortFilter, sortDirection)
if err != nil {
m.sortingModel.sortTextInput.SetValue("INVALID SHORTHAND VALUE")
break
}
m.currentState = stateTable
m.sortingModel.sortTextInput.Blur()
}
case "esc":
// switch from sorting state or verbose state to table state
if m.currentState == stateSorting || m.currentState == stateVerbose {
m.currentState = stateTable
}
}
case tea.WindowSizeMsg:
// This is needed to handle a bug with bubble tea
// where resizing causes misprints (https://github.com/Evertras/bubble-table/issues/121)
termenv.ClearScreen() //nolint:staticcheck
// handle screen resizing
m.tableModel = m.tableModel.resizeView(msg)
m.verboseModel = m.verboseModel.resizeView(msg)
m.sortingModel = m.sortingModel.resizeView(msg)
}
var cmd tea.Cmd
// update currently active state
switch m.currentState {
case stateTable:
m.tableModel, cmd = m.tableModel.update(msg)
case stateVerbose:
m.verboseModel, cmd = m.verboseModel.update(msg)
case stateSorting:
m.sortingModel, cmd = m.sortingModel.update(msg)
}
return m, cmd
}