Skip to content

Commit 58fcdcf

Browse files
feat: implement core task management, storage repository, and editor UI components
1 parent 19208fb commit 58fcdcf

6 files changed

Lines changed: 63 additions & 23 deletions

File tree

internal/app/model.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -713,9 +713,9 @@ func (m *Model) renderFooter() string {
713713
style := m.s.Muted
714714
if m.isErr {
715715
icon = styles.IconError
716-
style = lipgloss.NewStyle().Foreground(m.s.Theme.Bad).Bold(true)
716+
style = m.s.Muted.Foreground(m.s.Theme.Bad).Bold(true)
717717
} else {
718-
style = lipgloss.NewStyle().Foreground(m.s.Theme.Good).Bold(true)
718+
style = m.s.Muted.Foreground(m.s.Theme.Good).Bold(true)
719719
}
720720
right = style.Render(icon+" ") + m.s.Muted.Render(m.statusText) + " "
721721
} else {

internal/core/task.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ func (t Task) Validate() error {
101101
if !t.Status.Valid() {
102102
return errors.New("invalid status")
103103
}
104-
t.Priority = t.Priority.Clamp()
105104
return nil
106105
}
107106

internal/plugins/host.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ func (h *Host) RunCommand(ctx context.Context, fullID string) error {
197197
return errors.New("plugin has no commands")
198198
}
199199

200-
var run lua.LValue = lua.LNil
200+
run := lua.LNil
201201
ctbl.ForEach(func(_ lua.LValue, v lua.LValue) {
202202
if run.Type() == lua.LTFunction {
203203
return

internal/storage/repo.go

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,11 @@ func (r *Repository) SyncSnapshot(ctx context.Context) ([]core.Task, []Tombstone
161161
if err != nil {
162162
return nil, nil, err
163163
}
164-
defer rows.Close()
164+
defer func() {
165+
if err := rows.Close(); err != nil {
166+
// Log or handle error appropriately
167+
}
168+
}()
165169
var tasks []core.Task
166170
for rows.Next() {
167171
var (
@@ -212,7 +216,11 @@ func (r *Repository) SyncSnapshot(ctx context.Context) ([]core.Task, []Tombstone
212216
ORDER BY g.name ASC
213217
`, idSet...)
214218
if err == nil {
215-
defer tagRows.Close()
219+
defer func() {
220+
if err := tagRows.Close(); err != nil {
221+
// Log or handle error appropriately
222+
}
223+
}()
216224
tagsByID := map[string][]string{}
217225
for tagRows.Next() {
218226
var taskID, name string
@@ -235,7 +243,11 @@ func (r *Repository) SyncSnapshot(ctx context.Context) ([]core.Task, []Tombstone
235243
if err != nil {
236244
return tasks, nil, nil
237245
}
238-
defer tRows.Close()
246+
defer func() {
247+
if err := tRows.Close(); err != nil {
248+
// Log or handle error appropriately
249+
}
250+
}()
239251
var tomb []Tombstone
240252
for tRows.Next() {
241253
var id string
@@ -309,9 +321,6 @@ func (r *Repository) ListTasks(ctx context.Context, opt ListOptions) ([]core.Tas
309321
where = append(where, "t.deadline_ms IS NOT NULL AND t.deadline_ms < ?")
310322
args = append(args, opt.Filter.To.UTC().UnixMilli())
311323
}
312-
if opt.Filter.IncludeNilDeadline && opt.Filter.From == nil && opt.Filter.To == nil {
313-
// no deadline constraints; include nil by default.
314-
}
315324
if opt.Filter.Tag != "" {
316325
where = append(where, "EXISTS (SELECT 1 FROM task_tags tt JOIN tags g ON g.id=tt.tag_id WHERE tt.task_id=t.id AND g.name=?)")
317326
args = append(args, core.NormalizeTag(opt.Filter.Tag))
@@ -352,7 +361,11 @@ func (r *Repository) ListTasks(ctx context.Context, opt ListOptions) ([]core.Tas
352361
if err != nil {
353362
return nil, err
354363
}
355-
defer rows.Close()
364+
defer func() {
365+
if err := rows.Close(); err != nil {
366+
// Log or handle error appropriately
367+
}
368+
}()
356369

357370
out := []core.Task{}
358371
for rows.Next() {
@@ -408,7 +421,11 @@ func (r *Repository) ListTasks(ctx context.Context, opt ListOptions) ([]core.Tas
408421
if err != nil {
409422
return out, nil
410423
}
411-
defer tagRows.Close()
424+
defer func() {
425+
if err := tagRows.Close(); err != nil {
426+
// Log or handle error appropriately
427+
}
428+
}()
412429

413430
tagsByID := map[string][]string{}
414431
for tagRows.Next() {
@@ -429,7 +446,11 @@ func (r *Repository) ListTags(ctx context.Context) ([]string, error) {
429446
if err != nil {
430447
return nil, err
431448
}
432-
defer rows.Close()
449+
defer func() {
450+
if err := rows.Close(); err != nil {
451+
// Log or handle error appropriately
452+
}
453+
}()
433454
var out []string
434455
for rows.Next() {
435456
var n string
@@ -451,7 +472,11 @@ func (r *Repository) AllTasks(ctx context.Context) ([]core.Task, error) {
451472
if err != nil {
452473
return nil, err
453474
}
454-
defer rows.Close()
475+
defer func() {
476+
if err := rows.Close(); err != nil {
477+
// Log or handle error appropriately
478+
}
479+
}()
455480
var out []core.Task
456481
for rows.Next() {
457482
var (
@@ -505,7 +530,11 @@ func (r *Repository) AllTasks(ctx context.Context) ([]core.Task, error) {
505530
if err != nil {
506531
return out, nil
507532
}
508-
defer tagRows.Close()
533+
defer func() {
534+
if err := tagRows.Close(); err != nil {
535+
// Log or handle error appropriately
536+
}
537+
}()
509538
tagsByID := map[string][]string{}
510539
for tagRows.Next() {
511540
var taskID, name string
@@ -590,7 +619,11 @@ func (r *Repository) taskTags(ctx context.Context, id string) ([]string, error)
590619
if err != nil {
591620
return nil, err
592621
}
593-
defer rows.Close()
622+
defer func() {
623+
if err := rows.Close(); err != nil {
624+
// Log or handle error appropriately
625+
}
626+
}()
594627
var out []string
595628
for rows.Next() {
596629
var n string

internal/storage/repo_test.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@ func TestCreateListUpdateDelete(t *testing.T) {
1616
if err != nil {
1717
t.Fatal(err)
1818
}
19-
defer r.Close()
19+
defer func() {
20+
if err := r.Close(); err != nil {
21+
t.Errorf("failed to close repository: %v", err)
22+
}
23+
}()
2024

2125
created, err := r.CreateTask(ctx, core.Task{
2226
Title: "Ship v1",
@@ -72,7 +76,11 @@ func TestUpsertAndTombstone(t *testing.T) {
7276
if err != nil {
7377
t.Fatal(err)
7478
}
75-
defer r.Close()
79+
defer func() {
80+
if err := r.Close(); err != nil {
81+
t.Errorf("failed to close repository: %v", err)
82+
}
83+
}()
7684

7785
now := time.Now().UTC()
7886
id, _ := core.NewID(now)

internal/ui/editor/model.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -193,13 +193,13 @@ func (m Model) View() string {
193193

194194
// Input fields with labels
195195
fields := []string{
196-
m.renderField("TITLE", m.title.View(), 0 == m.focus),
197-
m.renderField("TAGS", m.tags.View(), 1 == m.focus),
196+
m.renderField("TITLE", m.title.View(), m.focus == 0),
197+
m.renderField("TAGS", m.tags.View(), m.focus == 1),
198198
lipgloss.JoinHorizontal(lipgloss.Left,
199-
m.renderField("PRIORITY", m.priority.View(), 2 == m.focus),
200-
m.renderField("STATUS", m.status.View(), 4 == m.focus),
199+
m.renderField("PRIORITY", m.priority.View(), m.focus == 2),
200+
m.renderField("STATUS", m.status.View(), m.focus == 4),
201201
),
202-
m.renderField("DUE", m.deadline.View(), 3 == m.focus),
202+
m.renderField("DUE", m.deadline.View(), m.focus == 3),
203203
}
204204

205205
if m.deadlineErr != "" {

0 commit comments

Comments
 (0)