Skip to content
This repository has been archived by the owner on Feb 3, 2023. It is now read-only.

Commit

Permalink
delete group node
Browse files Browse the repository at this point in the history
  • Loading branch information
ingbyr committed Sep 12, 2022
1 parent 337d21f commit fbe275a
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 20 deletions.
24 changes: 21 additions & 3 deletions gohost/group.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,17 +43,16 @@ func (s *Service) loadGroups() []*Group {
return groups
}

func (s *Service) loadGroupsByParenID(parentID db.ID) []*Group {
func (s *Service) loadGroupsByParentID(parentID db.ID) []*Group {
var groups []*Group
if err := s.store.FindNullable(&groups, bolthold.Where("ParentID").Eq(parentID)); err != nil {
panic(err)
}
return groups
}


func (s *Service) loadGroupNodesByParent(parent *TreeNode) []*TreeNode {
groups := s.loadGroupsByParenID(parent.GetID())
groups := s.loadGroupsByParentID(parent.GetID())
nodes := make([]*TreeNode, len(groups))
for i := range groups {
node := NewTreeNode(groups[i])
Expand All @@ -79,3 +78,22 @@ func (s *Service) SaveGroupNode(groupNode *TreeNode) error {
s.nodes[groupNode.GetID()] = groupNode
return nil
}

func (s *Service) DeleteGroup(groupID db.ID) {
err := s.store.DeleteMatching(&Group{}, bolthold.Where("ID").Eq(groupID))
if err != nil {
panic(err)
}
}

func (s *Service) DeleteGroupNode(group *TreeNode) {
s.DeleteGroup(group.GetID())
// Delete from parent
group.Parent().RemoveChild(group)
children := s.LoadNodesByParent(group)
for i := range children {
s.DeleteGroupNode(children[i])
}
// Delete node cache
s.nodes[group.GetID()] = nil
}
9 changes: 9 additions & 0 deletions gohost/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,15 @@ func (n *TreeNode) SetChildren(children []*TreeNode) {
n.children = children
}

func (n *TreeNode) RemoveChild(child *TreeNode) {
for i := range n.children {
if n.children[i] == child {
n.SetChildren(append(n.children[:i], n.children[i+1:]...))
return
}
}
}

func (n *TreeNode) Depth() int {
return n.depth
}
Expand Down
18 changes: 3 additions & 15 deletions gohost/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,14 +78,6 @@ func (s *Service) buildTree(nodes []*TreeNode) {
}
}

func (s *Service) loadTree() {
s.nodes[0] = s.tree
nodes := []*TreeNode{s.SysHostNode}
nodes = append(nodes, s.LoadNodesByParentID(0)...)
s.cacheNodes(nodes)
s.buildTree(nodes)
}

func (s *Service) TreeNodesAsItem() []list.Item {
nodes := make([]list.Item, 0)
s.treeNodesAsItem([]*TreeNode{s.tree}, &nodes)
Expand All @@ -107,16 +99,12 @@ func (s *Service) treeNodesAsItem(nodes []*TreeNode, res *[]list.Item) {
}

func (s *Service) LoadRootNodes() []*TreeNode {
return s.LoadNodesByParentID(0)
return s.LoadNodesByParent(s.tree)
}

func (s *Service) LoadNodesByParentID(parentID db.ID) []*TreeNode {
parent := s.nodes[parentID]
if parent == nil {
panic("Cache the parent node first before load nodes by parent id")
}
func (s *Service) LoadNodesByParent(parent *TreeNode) []*TreeNode {
var nodes []*TreeNode
if parentID == 0 {
if parent == s.tree {
nodes = append(nodes, s.SysHostNode)
}
nodes = append(nodes, s.loadGroupNodesByParent(parent)...)
Expand Down
4 changes: 4 additions & 0 deletions tui/keys/keymap.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ var (
key.WithKeys("c"),
key.WithHelp("c", "new"),
)
Delete = key.NewBinding(
key.WithKeys("x", "delete"),
key.WithHelp("c/delete", "delete"),
)
)

func Arrows() []key.Binding {
Expand Down
17 changes: 15 additions & 2 deletions tui/tree_view.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,25 +113,38 @@ func (v *TreeView) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
}
switch {
case key.Matches(m, keys.Enter):
// Click the node
selectedNode := v.SelectedNode()
switch node := selectedNode.Node.(type) {
case *gohost.Group:
if selectedNode.IsFolded() {
selectedNode.SetFolded(false)
svc.LoadNodesByParentID(selectedNode.GetID())
svc.LoadNodesByParent(selectedNode)
} else {
selectedNode.SetFolded(true)
svc.RemoveNodesByParentID(selectedNode.GetID())
}
cmd = v.RefreshTreeNodes()
cmds = append(cmds, cmd)
case gohost.Host:
v.onHostNodeSelected(node, &cmds)
}

case key.Matches(m, keys.New):
// Create new node
v.model.switchState(nodeViewState)

case key.Matches(m, keys.Delete):
// Delete node
selectedNode := v.SelectedNode()
switch selectedNode.Node.(type) {
case *gohost.Group:
svc.DeleteGroupNode(selectedNode)
case gohost.Host:
}
cmd = v.RefreshTreeNodes()
}
}
cmds = append(cmds, cmd)
v.nodeList, cmd = v.nodeList.Update(msg)
//log.Debug(fmt.Sprintf("cursor at %d, selected item %v",
// v.nodeList.Cursor(), v.nodeList.SelectedItem().FilterValue()))
Expand Down

0 comments on commit fbe275a

Please sign in to comment.