Skip to content

Commit 65dd10d

Browse files
authored
Merge pull request #2 from pvik/bubbletea_ui
feat: allow select project on issue create
2 parents f03e4cc + 66e4586 commit 65dd10d

6 files changed

Lines changed: 82 additions & 16 deletions

File tree

cmd/lin/cli.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package main
33
import (
44
"context"
55
"os"
6+
"pvik/linear-cli/internal/ui"
67
"pvik/linear-cli/pkg/git"
78
"pvik/linear-cli/pkg/linear"
89

@@ -137,6 +138,7 @@ func (a App) ParseCLIParams() {
137138
issue := c.QueryIssue(issueId)
138139

139140
detailIssue(issue)
141+
140142
return nil
141143
},
142144
},
@@ -189,6 +191,10 @@ func (a App) ParseCLIParams() {
189191

190192
project := cmd.String("project")
191193
projectId := ""
194+
if project == "" {
195+
projects := a.getProjectsList()
196+
project = ui.SelectItem(projects, true)
197+
}
192198
if project != "" {
193199
projectId = a.getProjectId(project, true)
194200
}
@@ -201,6 +207,8 @@ func (a App) ParseCLIParams() {
201207

202208
myId := a.getMyId()
203209

210+
return nil
211+
204212
c := linear.Linear{ApiKey: a.LinearAPIToken}
205213
issue := c.CreateIssue(teamId, title, "", myId, stateId, priority, projectId, labelsIds)
206214

cmd/lin/linear_helper.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,19 @@ func (a App) getProjectId(projectName string, raiseOnNotFound bool) string {
5858
return ""
5959
}
6060

61+
func (a App) getProjectsList() []string {
62+
c := linear.Linear{ApiKey: a.LinearAPIToken}
63+
projects := c.QueryProjects()
64+
65+
ret := []string{}
66+
67+
for _, project := range projects {
68+
ret = append(ret, project.Name)
69+
}
70+
71+
return ret
72+
}
73+
6174
func (a App) getIssueLabelsIds(labels []string, raiseOnNotFound bool) []string {
6275
c := linear.Linear{ApiKey: a.LinearAPIToken}
6376
srvLabels := c.QueryIssueLabels(true)

go.mod

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,22 @@ go 1.25.4
55
require (
66
github.com/BurntSushi/toml v1.5.0
77
github.com/adrg/xdg v0.5.3
8-
github.com/go-git/go-git/v6 v6.0.0-20251112161705-8cc3e21f07a9
8+
github.com/go-git/go-git/v6 v6.0.0-20251118162427-2784eeea7f86
99
github.com/hasura/go-graphql-client v0.15.0
1010
github.com/jasonlovesdoggo/gopen v0.0.0-20250130105607-39c98c645030
1111
github.com/rs/zerolog v1.34.0
12-
github.com/urfave/cli/v3 v3.6.0
12+
github.com/urfave/cli/v3 v3.6.1
1313
)
1414

1515
require (
1616
github.com/Microsoft/go-winio v0.6.2 // indirect
1717
github.com/ProtonMail/go-crypto v1.3.0 // indirect
1818
github.com/cloudflare/circl v1.6.1 // indirect
1919
github.com/coder/websocket v1.8.14 // indirect
20-
github.com/cyphar/filepath-securejoin v0.5.0 // indirect
20+
github.com/cyphar/filepath-securejoin v0.6.1 // indirect
2121
github.com/emirpasic/gods v1.18.1 // indirect
2222
github.com/go-git/gcfg/v2 v2.0.2 // indirect
23-
github.com/go-git/go-billy/v6 v6.0.0-20251022185412-61e52df296a5 // indirect
23+
github.com/go-git/go-billy/v6 v6.0.0-20251111123000-fb5ff8f3f0b0 // indirect
2424
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
2525
github.com/google/uuid v1.6.0 // indirect
2626
github.com/kevinburke/ssh_config v1.4.0 // indirect
@@ -29,7 +29,7 @@ require (
2929
github.com/mattn/go-isatty v0.0.20 // indirect
3030
github.com/pjbgf/sha1cd v0.5.0 // indirect
3131
github.com/sergi/go-diff v1.4.0 // indirect
32-
golang.org/x/crypto v0.44.0 // indirect
32+
golang.org/x/crypto v0.45.0 // indirect
3333
golang.org/x/net v0.47.0 // indirect
3434
golang.org/x/sys v0.38.0 // indirect
3535
)

go.sum

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZ
1515
github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g=
1616
github.com/coder/websocket v1.8.14/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg=
1717
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
18-
github.com/cyphar/filepath-securejoin v0.5.0 h1:hIAhkRBMQ8nIeuVwcAoymp7MY4oherZdAxD+m0u9zaw=
19-
github.com/cyphar/filepath-securejoin v0.5.0/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI=
18+
github.com/cyphar/filepath-securejoin v0.6.1 h1:5CeZ1jPXEiYt3+Z6zqprSAgSWiggmpVyciv8syjIpVE=
19+
github.com/cyphar/filepath-securejoin v0.6.1/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc=
2020
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2121
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
2222
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -28,12 +28,12 @@ github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c=
2828
github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU=
2929
github.com/go-git/gcfg/v2 v2.0.2 h1:MY5SIIfTGGEMhdA7d7JePuVVxtKL7Hp+ApGDJAJ7dpo=
3030
github.com/go-git/gcfg/v2 v2.0.2/go.mod h1:/lv2NsxvhepuMrldsFilrgct6pxzpGdSRC13ydTLSLs=
31-
github.com/go-git/go-billy/v6 v6.0.0-20251022185412-61e52df296a5 h1:9nXOQ3HupDEerUXxiPrw3olFy/jHGZ3O3DyM/o6ejdc=
32-
github.com/go-git/go-billy/v6 v6.0.0-20251022185412-61e52df296a5/go.mod h1:TpCYxdQ0tWZkrnAkd7yqK+z1C8RKcyjcaYAJNAcnUnM=
31+
github.com/go-git/go-billy/v6 v6.0.0-20251111123000-fb5ff8f3f0b0 h1:EC9n6hr6yKDoVJ6g7Ko523LbbceJfR0ohbOp809Fyf4=
32+
github.com/go-git/go-billy/v6 v6.0.0-20251111123000-fb5ff8f3f0b0/go.mod h1:E3VhlS+AKkrq6ZNn1axE2/nDRJ87l1FJk9r5HT2vPX0=
3333
github.com/go-git/go-git-fixtures/v5 v5.1.1 h1:OH8i1ojV9bWfr0ZfasfpgtUXQHQyVS8HXik/V1C099w=
3434
github.com/go-git/go-git-fixtures/v5 v5.1.1/go.mod h1:Altk43lx3b1ks+dVoAG2300o5WWUnktvfY3VI6bcaXU=
35-
github.com/go-git/go-git/v6 v6.0.0-20251112161705-8cc3e21f07a9 h1:SOFrnF9LCssC6q6Rb0084Bzg2aBYbe8QXv9xKGXmt/w=
36-
github.com/go-git/go-git/v6 v6.0.0-20251112161705-8cc3e21f07a9/go.mod h1:0wtvm/JfPC9RFVEAP3ks0ec5h64/qmZkTTUE3pjz7Hc=
35+
github.com/go-git/go-git/v6 v6.0.0-20251118162427-2784eeea7f86 h1:r5b+1R943RlT7akgNlD5PXf+hVkON37p4l7W1UXlTmA=
36+
github.com/go-git/go-git/v6 v6.0.0-20251118162427-2784eeea7f86/go.mod h1:0wtvm/JfPC9RFVEAP3ks0ec5h64/qmZkTTUE3pjz7Hc=
3737
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
3838
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
3939
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
@@ -71,10 +71,10 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
7171
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
7272
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
7373
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
74-
github.com/urfave/cli/v3 v3.6.0 h1:oIdArVjkdIXHWg3iqxgmqwQGC8NM0JtdgwQAj2sRwFo=
75-
github.com/urfave/cli/v3 v3.6.0/go.mod h1:ysVLtOEmg2tOy6PknnYVhDoouyC/6N42TMeoMzskhso=
76-
golang.org/x/crypto v0.44.0 h1:A97SsFvM3AIwEEmTBiaxPPTYpDC47w720rdiiUvgoAU=
77-
golang.org/x/crypto v0.44.0/go.mod h1:013i+Nw79BMiQiMsOPcVCB5ZIJbYkerPrGnOa00tvmc=
74+
github.com/urfave/cli/v3 v3.6.1 h1:j8Qq8NyUawj/7rTYdBGrxcH7A/j7/G8Q5LhWEW4G3Mo=
75+
github.com/urfave/cli/v3 v3.6.1/go.mod h1:ysVLtOEmg2tOy6PknnYVhDoouyC/6N42TMeoMzskhso=
76+
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
77+
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
7878
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
7979
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
8080
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

internal/ui/get_project.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package ui
2+
3+
import (
4+
"bufio"
5+
"fmt"
6+
"log"
7+
"os"
8+
"strconv"
9+
"strings"
10+
)
11+
12+
func SelectItem(items []string, listItems bool) string {
13+
mp := make(map[int]string)
14+
for idx, item := range items {
15+
mp[idx] = item
16+
if listItems {
17+
fmt.Printf("\t%3d : %s\n", idx, item)
18+
}
19+
}
20+
fmt.Printf("Select: ")
21+
reader := bufio.NewReader(os.Stdin)
22+
line, err := reader.ReadString('\n')
23+
if err != nil {
24+
log.Fatal(err)
25+
}
26+
27+
line = strings.TrimSpace(line)
28+
29+
// string to int
30+
i, err := strconv.Atoi(line)
31+
if err != nil {
32+
fmt.Println("ERROR: Invalid selection...")
33+
return SelectItem(items, false)
34+
}
35+
36+
item, found := mp[i]
37+
if !found {
38+
fmt.Println("ERROR: Invalid selection")
39+
return SelectItem(items, false)
40+
}
41+
42+
fmt.Printf("selected: %s\n", item)
43+
44+
return item
45+
}

pkg/linear/project.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ func (l Linear) QueryProjects() []ProjectNode {
1212
var queryProjects struct {
1313
Projects struct {
1414
Nodes []ProjectNode
15-
} `graphql:"projects(orderBy: updatedAt, filter: {and: [{status: {name: {neq: \"Completed\"}}}]})"`
15+
} `graphql:"projects(orderBy: createdAt, filter: {and: [{status: {name: {neq: \"Completed\"}}}]})"`
1616
}
1717

1818
err := client.Query(context.Background(), &queryProjects, nil)

0 commit comments

Comments
 (0)