package upgrade import ( "git.cycore.io/scm/talos-upgrade/pkg/node" "github.com/charmbracelet/bubbles/list" tea "github.com/charmbracelet/bubbletea" ) type SelectNode struct { Core *CoreState list list.Model } func NewSelectNode(core *CoreState) *SelectNode { upgradableNodes := node.NotVersion(core.Nodes, core.SelectedVersion) s := &SelectNode{ Core: core, list: node.ListFromNodes(upgradableNodes), } if len(upgradableNodes) == 0 { s.list.Title = "All nodes upgraded!" } else { s.list.Title = "Select Node to Upgrade" } frameWidth, frameHeight := docStyle.GetFrameSize() s.list.SetSize(s.Core.Width-frameWidth, s.Core.Height-frameHeight) return s } func (s *SelectNode) Init() tea.Cmd { return nil } func (s *SelectNode) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: if msg.String() == "ctrl+c" { return s, tea.Quit } if msg.String() == "enter" { selectedItem := s.list.Items()[s.list.Index()] selectedNode := selectedItem.(*node.ListItem) return &Node{ core: s.Core, node: selectedNode.Node, }, nil } case tea.WindowSizeMsg: s.Core.Width = msg.Width s.Core.Height = msg.Height frameWidth, frameHeight := docStyle.GetFrameSize() s.list.SetSize(msg.Width-frameWidth, msg.Height-frameHeight) default: } var cmd tea.Cmd s.list, cmd = s.list.Update(msg) return s, cmd } func (s *SelectNode) View() string { return docStyle.Render(s.list.View()) }