Skip to content

Commit 6b8948a

Browse files
authored
feat(#56): show counter of filtered rows (#70)
1 parent 144f8b8 commit 6b8948a

14 files changed

+112
-107
lines changed

internal/app/helper.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ func (h helper) handleLogEntriesLoadedMsg(
102102

103103
func (h helper) handleOpenJSONRowRequestedMsg(
104104
msg events.OpenJSONRowRequestedMsg,
105-
previousState state,
105+
previousState stateModel,
106106
) (tea.Model, tea.Cmd) {
107107
if msg.Index < 0 || msg.Index >= len(msg.LogEntries) {
108108
return previousState, nil

internal/app/state.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import (
66
tea "github.com/charmbracelet/bubbletea"
77
)
88

9-
type state interface {
9+
type stateModel interface {
1010
tea.Model
1111
fmt.Stringer
1212

13-
withApplication(application Application) (state, tea.Cmd)
13+
withApplication(application Application) (stateModel, tea.Cmd)
1414
}

internal/app/stateerror.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,32 @@ import (
66
tea "github.com/charmbracelet/bubbletea"
77
)
88

9-
// StateError is a failure message state.
10-
type StateError struct {
9+
// StateErrorModel is a failure message state.
10+
type StateErrorModel struct {
1111
helper
1212

1313
err error
1414
}
1515

16-
func newStateError(application Application, err error) StateError {
17-
return StateError{
16+
func newStateError(application Application, err error) StateErrorModel {
17+
return StateErrorModel{
1818
helper: helper{Application: application},
1919
err: err,
2020
}
2121
}
2222

2323
// Init initializes component. It implements tea.Model.
24-
func (s StateError) Init() tea.Cmd {
24+
func (s StateErrorModel) Init() tea.Cmd {
2525
return nil
2626
}
2727

2828
// View renders component. It implements tea.Model.
29-
func (s StateError) View() string {
29+
func (s StateErrorModel) View() string {
3030
return fmt.Sprintf("Something went wrong: %s.", s.err)
3131
}
3232

3333
// Update handles events. It implements tea.Model.
34-
func (s StateError) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
34+
func (s StateErrorModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
3535
s.helper = s.helper.Update(msg)
3636

3737
switch msg.(type) {
@@ -43,6 +43,6 @@ func (s StateError) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
4343
}
4444

4545
// String implements fmt.Stringer.
46-
func (s StateError) String() string {
46+
func (s StateErrorModel) String() string {
4747
return modelValue(s)
4848
}

internal/app/stateerror_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func TestStateError(t *testing.T) {
2121
model := newTestModel(t, assets.ExampleJSONLog())
2222
model = handleUpdate(model, events.ErrorOccuredMsg{Err: errTest})
2323

24-
_, ok := model.(app.StateError)
24+
_, ok := model.(app.StateErrorModel)
2525
assert.Truef(t, ok, "%s", model)
2626

2727
t.Run("rendered", func(t *testing.T) {
@@ -52,7 +52,7 @@ func TestStateError(t *testing.T) {
5252

5353
model := handleUpdate(model, events.ViewRowsReloadRequestedMsg{})
5454

55-
_, ok := model.(app.StateError)
55+
_, ok := model.(app.StateErrorModel)
5656
require.Truef(t, ok, "%s", model)
5757
})
5858
}

internal/app/statefiltered.go

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
package app
22

33
import (
4+
"fmt"
5+
46
"github.com/charmbracelet/bubbles/key"
57
tea "github.com/charmbracelet/bubbletea"
68

79
"github.com/hedhyw/json-log-viewer/internal/pkg/events"
810
"github.com/hedhyw/json-log-viewer/internal/pkg/source"
911
)
1012

11-
// StateFiltered is a state that shows filtered records.
12-
type StateFiltered struct {
13+
// StateFilteredModel is a state that shows filtered records.
14+
type StateFilteredModel struct {
1315
helper
1416

15-
previousState StateLoaded
17+
previousState StateLoadedModel
1618
table logsTableModel
1719
logEntries source.LazyLogEntries
1820

@@ -22,10 +24,10 @@ type StateFiltered struct {
2224

2325
func newStateFiltered(
2426
application Application,
25-
previousState StateLoaded,
27+
previousState StateLoadedModel,
2628
filterText string,
27-
) StateFiltered {
28-
return StateFiltered{
29+
) StateFilteredModel {
30+
return StateFilteredModel{
2931
helper: helper{Application: application},
3032

3133
previousState: previousState,
@@ -37,7 +39,7 @@ func newStateFiltered(
3739
}
3840

3941
// Init initializes component. It implements tea.Model.
40-
func (s StateFiltered) Init() tea.Cmd {
42+
func (s StateFilteredModel) Init() tea.Cmd {
4143
return func() tea.Msg {
4244
return events.LogEntriesLoadedMsg(
4345
s.previousState.logEntries.Filter(s.filterText),
@@ -46,14 +48,16 @@ func (s StateFiltered) Init() tea.Cmd {
4648
}
4749

4850
// View renders component. It implements tea.Model.
49-
func (s StateFiltered) View() string {
50-
footer := s.Application.FooterStyle.Render(" filtered by: " + s.filterText)
51+
func (s StateFilteredModel) View() string {
52+
footer := s.Application.FooterStyle.Render(
53+
fmt.Sprintf("filtered %d by: %s", len(s.logEntries), s.filterText),
54+
)
5155

5256
return s.BaseStyle.Render(s.table.View()) + "\n" + footer
5357
}
5458

5559
// Update handles events. It implements tea.Model.
56-
func (s StateFiltered) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
60+
func (s StateFilteredModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
5761
var cmdBatch []tea.Cmd
5862

5963
s.helper = s.helper.Update(msg)
@@ -86,7 +90,7 @@ func (s StateFiltered) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
8690
return s, tea.Batch(cmdBatch...)
8791
}
8892

89-
func (s StateFiltered) handleLogEntriesLoadedMsg(
93+
func (s StateFilteredModel) handleLogEntriesLoadedMsg(
9094
msg events.LogEntriesLoadedMsg,
9195
) (tea.Model, tea.Cmd) {
9296
s.logEntries = source.LazyLogEntries(msg)
@@ -95,7 +99,7 @@ func (s StateFiltered) handleLogEntriesLoadedMsg(
9599
return s, s.table.Init()
96100
}
97101

98-
func (s StateFiltered) handleFilterKeyClickedMsg() (tea.Model, tea.Cmd) {
102+
func (s StateFilteredModel) handleFilterKeyClickedMsg() (tea.Model, tea.Cmd) {
99103
state := newStateFiltering(
100104
s.Application,
101105
s.previousState,
@@ -104,15 +108,15 @@ func (s StateFiltered) handleFilterKeyClickedMsg() (tea.Model, tea.Cmd) {
104108
return initializeModel(state)
105109
}
106110

107-
func (s StateFiltered) handleRequestOpenJSON() (tea.Model, tea.Cmd) {
111+
func (s StateFilteredModel) handleRequestOpenJSON() (tea.Model, tea.Cmd) {
108112
if len(s.logEntries) == 0 {
109113
return s, events.BackKeyClicked
110114
}
111115

112116
return s, events.OpenJSONRowRequested(s.logEntries, s.table.Cursor())
113117
}
114118

115-
func (s StateFiltered) withApplication(application Application) (state, tea.Cmd) {
119+
func (s StateFilteredModel) withApplication(application Application) (stateModel, tea.Cmd) {
116120
s.Application = application
117121

118122
var cmd tea.Cmd
@@ -122,6 +126,6 @@ func (s StateFiltered) withApplication(application Application) (state, tea.Cmd)
122126
}
123127

124128
// String implements fmt.Stringer.
125-
func (s StateFiltered) String() string {
129+
func (s StateFilteredModel) String() string {
126130
return modelValue(s)
127131
}

internal/app/statefiltered_test.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func TestStateFiltered(t *testing.T) {
4040
lines := strings.Split(model.View(), "\n")
4141
assert.Contains(t, lines[len(lines)-1], ">")
4242

43-
_, ok := model.(app.StateFiltering)
43+
_, ok := model.(app.StateFilteringModel)
4444
assert.Truef(t, ok, "%s", model)
4545

4646
// Write term to search by.
@@ -54,10 +54,11 @@ func TestStateFiltered(t *testing.T) {
5454
Type: tea.KeyEnter,
5555
})
5656

57-
_, ok = model.(app.StateFiltered)
57+
_, ok = model.(app.StateFilteredModel)
5858
if assert.Truef(t, ok, "%s", model) {
5959
rendered = model.View()
6060
assert.Contains(t, rendered, termIncluded)
61+
assert.Contains(t, rendered, "filtered 1 by: "+termIncluded)
6162
assert.NotContains(t, rendered, termExcluded)
6263
}
6364

@@ -69,7 +70,7 @@ func TestStateFiltered(t *testing.T) {
6970
Runes: []rune{'f'},
7071
})
7172

72-
_, ok := model.(app.StateFiltering)
73+
_, ok := model.(app.StateFilteringModel)
7374
assert.Truef(t, ok, "%s", model)
7475
})
7576

@@ -80,14 +81,14 @@ func TestStateFiltered(t *testing.T) {
8081
Type: tea.KeyEnter,
8182
})
8283

83-
_, ok := model.(app.StateViewRow)
84+
_, ok := model.(app.StateViewRowModel)
8485
assert.Truef(t, ok, "%s", model)
8586

8687
model = handleUpdate(model, tea.KeyMsg{
8788
Type: tea.KeyEsc,
8889
})
8990

90-
_, ok = model.(app.StateFiltered)
91+
_, ok = model.(app.StateFilteredModel)
9192
assert.Truef(t, ok, "%s", model)
9293
})
9394

@@ -96,7 +97,7 @@ func TestStateFiltered(t *testing.T) {
9697

9798
model := handleUpdate(model, events.ErrorOccuredMsg{Err: getTestError()})
9899

99-
_, ok := model.(app.StateError)
100+
_, ok := model.(app.StateErrorModel)
100101
assert.Truef(t, ok, "%s", model)
101102
})
102103

@@ -107,7 +108,7 @@ func TestStateFiltered(t *testing.T) {
107108
Type: tea.KeyUp,
108109
})
109110

110-
_, ok = model.(app.StateFiltered)
111+
_, ok = model.(app.StateFilteredModel)
111112
assert.Truef(t, ok, "%s", model)
112113
})
113114

@@ -118,7 +119,7 @@ func TestStateFiltered(t *testing.T) {
118119
Type: tea.KeyEsc,
119120
})
120121

121-
_, ok := model.(app.StateLoaded)
122+
_, ok := model.(app.StateLoadedModel)
122123
assert.Truef(t, ok, "%s", model)
123124
})
124125

internal/app/statefiltering.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ import (
88
"github.com/hedhyw/json-log-viewer/internal/pkg/events"
99
)
1010

11-
// StateFiltering is a state to prompt for filter term.
12-
type StateFiltering struct {
11+
// StateFilteringModel is a state to prompt for filter term.
12+
type StateFilteringModel struct {
1313
helper
1414

15-
previousState StateLoaded
15+
previousState StateLoadedModel
1616
table logsTableModel
1717

1818
textInput textinput.Model
@@ -21,12 +21,12 @@ type StateFiltering struct {
2121

2222
func newStateFiltering(
2323
application Application,
24-
previousState StateLoaded,
25-
) StateFiltering {
24+
previousState StateLoadedModel,
25+
) StateFilteringModel {
2626
textInput := textinput.New()
2727
textInput.Focus()
2828

29-
return StateFiltering{
29+
return StateFilteringModel{
3030
helper: helper{Application: application},
3131

3232
previousState: previousState,
@@ -38,17 +38,17 @@ func newStateFiltering(
3838
}
3939

4040
// Init initializes component. It implements tea.Model.
41-
func (s StateFiltering) Init() tea.Cmd {
41+
func (s StateFilteringModel) Init() tea.Cmd {
4242
return nil
4343
}
4444

4545
// View renders component. It implements tea.Model.
46-
func (s StateFiltering) View() string {
46+
func (s StateFilteringModel) View() string {
4747
return s.BaseStyle.Render(s.table.View()) + "\n" + s.textInput.View()
4848
}
4949

5050
// Update handles events. It implements tea.Model.
51-
func (s StateFiltering) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
51+
func (s StateFilteringModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
5252
var cmdBatch []tea.Cmd
5353

5454
s.helper = s.helper.Update(msg)
@@ -76,15 +76,15 @@ func (s StateFiltering) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
7676
return s, tea.Batch(cmdBatch...)
7777
}
7878

79-
func (s StateFiltering) handleKeyMsg(msg tea.KeyMsg) tea.Cmd {
79+
func (s StateFilteringModel) handleKeyMsg(msg tea.KeyMsg) tea.Cmd {
8080
if len(msg.Runes) == 1 {
8181
return nil
8282
}
8383

8484
return s.helper.handleKeyMsg(msg)
8585
}
8686

87-
func (s StateFiltering) handleEnterKeyClickedMsg() (tea.Model, tea.Cmd) {
87+
func (s StateFilteringModel) handleEnterKeyClickedMsg() (tea.Model, tea.Cmd) {
8888
if s.textInput.Value() == "" {
8989
return s, events.BackKeyClicked
9090
}
@@ -97,6 +97,6 @@ func (s StateFiltering) handleEnterKeyClickedMsg() (tea.Model, tea.Cmd) {
9797
}
9898

9999
// String implements fmt.Stringer.
100-
func (s StateFiltering) String() string {
100+
func (s StateFilteringModel) String() string {
101101
return modelValue(s)
102102
}

0 commit comments

Comments
 (0)