backstack: reimplemented the backstack
This is a much cleaner implementation.
This commit is contained in:
parent
ec9ac34d26
commit
6c5787b271
|
@ -74,8 +74,9 @@ func (c *TableReadController) ScanTable(name string) tea.Cmd {
|
|||
if err != nil {
|
||||
return events.Error(err)
|
||||
}
|
||||
resultSet = c.tableService.Filter(resultSet, c.state.Filter())
|
||||
|
||||
return c.setResultSetAndFilter(resultSet, c.state.Filter())
|
||||
return c.setResultSetAndFilter(resultSet, c.state.Filter(), true)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -88,32 +89,33 @@ func (c *TableReadController) PromptForQuery() tea.Cmd {
|
|||
return c.runQuery(c.state.ResultSet().TableInfo, value, "", true)
|
||||
}
|
||||
|
||||
/*
|
||||
if value == "" {
|
||||
return func() tea.Msg {
|
||||
resultSet := c.state.ResultSet()
|
||||
return c.doScan(context.Background(), resultSet, nil)
|
||||
}
|
||||
}
|
||||
|
||||
expr, err := queryexpr.Parse(value)
|
||||
if err != nil {
|
||||
return events.SetError(err)
|
||||
}
|
||||
|
||||
return c.doIfNoneDirty(func() tea.Msg {
|
||||
resultSet := c.state.ResultSet()
|
||||
newResultSet, err := c.tableService.ScanOrQuery(context.Background(), resultSet.TableInfo, expr)
|
||||
if err != nil {
|
||||
return events.Error(err)
|
||||
}
|
||||
|
||||
if err := c.workspaceService.PushSnapshot(resultSet, ""); err != nil {
|
||||
log.Printf("cannot push snapshot: %v", err)
|
||||
}
|
||||
return c.setResultSetAndFilter(newResultSet, "")
|
||||
})
|
||||
*/
|
||||
//if value == "" {
|
||||
// return func() tea.Msg {
|
||||
// resultSet := c.state.ResultSet()
|
||||
// if err := c.workspaceService.PushSnapshot(resultSet, ""); err != nil {
|
||||
// log.Printf("cannot push snapshot: %v", err)
|
||||
// }
|
||||
// return c.doScan(context.Background(), resultSet, nil)
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//expr, err := queryexpr.Parse(value)
|
||||
//if err != nil {
|
||||
// return events.SetError(err)
|
||||
//}
|
||||
//
|
||||
//return c.doIfNoneDirty(func() tea.Msg {
|
||||
// resultSet := c.state.ResultSet()
|
||||
// newResultSet, err := c.tableService.ScanOrQuery(context.Background(), resultSet.TableInfo, expr)
|
||||
// if err != nil {
|
||||
// return events.Error(err)
|
||||
// }
|
||||
//
|
||||
// if err := c.workspaceService.PushSnapshot(resultSet, ""); err != nil {
|
||||
// log.Printf("cannot push snapshot: %v", err)
|
||||
// }
|
||||
// return c.setResultSetAndFilter(newResultSet, "")
|
||||
//})
|
||||
},
|
||||
}
|
||||
}
|
||||
|
@ -129,7 +131,8 @@ func (c *TableReadController) runQuery(tableInfo *models.TableInfo, query, newFi
|
|||
if newFilter != "" {
|
||||
newResultSet = c.tableService.Filter(newResultSet, newFilter)
|
||||
}
|
||||
return c.setResultSetAndFilter(newResultSet, newFilter)
|
||||
|
||||
return c.setResultSetAndFilter(newResultSet, newFilter, pushSnapshot)
|
||||
}
|
||||
|
||||
expr, err := queryexpr.Parse(query)
|
||||
|
@ -138,21 +141,15 @@ func (c *TableReadController) runQuery(tableInfo *models.TableInfo, query, newFi
|
|||
}
|
||||
|
||||
return c.doIfNoneDirty(func() tea.Msg {
|
||||
resultSet := c.state.ResultSet()
|
||||
newResultSet, err := c.tableService.ScanOrQuery(context.Background(), tableInfo, expr)
|
||||
if err != nil {
|
||||
return events.Error(err)
|
||||
}
|
||||
|
||||
if pushSnapshot {
|
||||
if err := c.workspaceService.PushSnapshot(resultSet, c.state.Filter()); err != nil {
|
||||
log.Printf("cannot push snapshot: %v", err)
|
||||
}
|
||||
}
|
||||
if newFilter != "" {
|
||||
newResultSet = c.tableService.Filter(newResultSet, newFilter)
|
||||
}
|
||||
return c.setResultSetAndFilter(newResultSet, newFilter)
|
||||
return c.setResultSetAndFilter(newResultSet, newFilter, pushSnapshot)
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -182,7 +179,7 @@ func (c *TableReadController) Rescan() tea.Cmd {
|
|||
return func() tea.Msg {
|
||||
return c.doIfNoneDirty(func() tea.Msg {
|
||||
resultSet := c.state.ResultSet()
|
||||
return c.doScan(context.Background(), resultSet, resultSet.Query)
|
||||
return c.doScan(context.Background(), resultSet, resultSet.Query, true)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -222,19 +219,24 @@ func (c *TableReadController) ExportCSV(filename string) tea.Cmd {
|
|||
}
|
||||
}
|
||||
|
||||
func (c *TableReadController) doScan(ctx context.Context, resultSet *models.ResultSet, query models.Queryable) tea.Msg {
|
||||
func (c *TableReadController) doScan(ctx context.Context, resultSet *models.ResultSet, query models.Queryable, pushBackstack bool) tea.Msg {
|
||||
newResultSet, err := c.tableService.ScanOrQuery(ctx, resultSet.TableInfo, query)
|
||||
if err != nil {
|
||||
return events.Error(err)
|
||||
}
|
||||
|
||||
c.workspaceService.PushSnapshot(resultSet, c.state.Filter())
|
||||
newResultSet = c.tableService.Filter(newResultSet, c.state.Filter())
|
||||
|
||||
return c.setResultSetAndFilter(newResultSet, c.state.Filter())
|
||||
return c.setResultSetAndFilter(newResultSet, c.state.Filter(), pushBackstack)
|
||||
}
|
||||
|
||||
func (c *TableReadController) setResultSetAndFilter(resultSet *models.ResultSet, filter string) tea.Msg {
|
||||
func (c *TableReadController) setResultSetAndFilter(resultSet *models.ResultSet, filter string, pushBackstack bool) tea.Msg {
|
||||
if pushBackstack {
|
||||
if err := c.workspaceService.PushSnapshot(resultSet, filter); err != nil {
|
||||
log.Printf("cannot push snapshot: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
c.state.setResultSetAndFilter(resultSet, filter)
|
||||
return c.state.buildNewResultSetMessage("")
|
||||
}
|
||||
|
@ -257,11 +259,9 @@ func (c *TableReadController) Filter() tea.Cmd {
|
|||
OnDone: func(value string) tea.Cmd {
|
||||
return func() tea.Msg {
|
||||
resultSet := c.state.ResultSet()
|
||||
|
||||
c.workspaceService.PushSnapshot(resultSet, c.state.Filter())
|
||||
newResultSet := c.tableService.Filter(resultSet, value)
|
||||
|
||||
return c.setResultSetAndFilter(newResultSet, value)
|
||||
return c.setResultSetAndFilter(newResultSet, value, true)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
@ -288,7 +288,7 @@ func (c *TableReadController) ViewBack() tea.Cmd {
|
|||
log.Printf("backstack: setting filter to '%v'", viewSnapshot.Filter)
|
||||
|
||||
newResultSet := c.tableService.Filter(currentResultSet, viewSnapshot.Filter)
|
||||
return c.setResultSetAndFilter(newResultSet, viewSnapshot.Filter)
|
||||
return c.setResultSetAndFilter(newResultSet, viewSnapshot.Filter, false)
|
||||
}
|
||||
|
||||
tableInfo := currentResultSet.TableInfo
|
||||
|
|
|
@ -400,7 +400,7 @@ func (twc *TableWriteController) NoisyTouchItem(idx int) tea.Cmd {
|
|||
return events.Error(err)
|
||||
}
|
||||
|
||||
return twc.tableReadControllers.doScan(ctx, resultSet, resultSet.Query)
|
||||
return twc.tableReadControllers.doScan(ctx, resultSet, resultSet.Query, false)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
@ -431,7 +431,7 @@ func (twc *TableWriteController) DeleteMarked() tea.Cmd {
|
|||
return events.Error(err)
|
||||
}
|
||||
|
||||
return twc.tableReadControllers.doScan(ctx, resultSet, resultSet.Query)
|
||||
return twc.tableReadControllers.doScan(ctx, resultSet, resultSet.Query, false)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
|
|
@ -47,9 +47,8 @@ func (s *ViewSnapshotService) PopSnapshot() (*serialisable.ViewSnapshot, error)
|
|||
vs, err := s.store.Head()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "cannot get snapshot head")
|
||||
}
|
||||
if vs == nil {
|
||||
return vs, nil
|
||||
} else if vs == nil || vs.BackLink == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
if err := s.store.SetAsHead(vs.BackLink); err != nil {
|
||||
|
@ -59,5 +58,12 @@ func (s *ViewSnapshotService) PopSnapshot() (*serialisable.ViewSnapshot, error)
|
|||
return nil, errors.Wrap(err, "cannot remove old ID")
|
||||
}
|
||||
|
||||
vs, err = s.store.Head()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "cannot get snapshot head")
|
||||
} else if vs == nil || vs.BackLink == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
return vs, nil
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue