156 lines
3.2 KiB
Go
156 lines
3.2 KiB
Go
package tui
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"runtime"
|
|
"strings"
|
|
|
|
"github.com/cli/safeexec"
|
|
"github.com/gdamore/tcell/v2"
|
|
"github.com/mattn/go-isatty"
|
|
"github.com/rivo/tview"
|
|
|
|
"github.com/ankitpokhrel/jira-cli/pkg/tui/primitive"
|
|
)
|
|
|
|
func pad(in string, n uint) string {
|
|
if in == "" {
|
|
return in
|
|
}
|
|
|
|
var (
|
|
i uint
|
|
out strings.Builder
|
|
)
|
|
|
|
for i = 0; i < n; i++ {
|
|
out.WriteString(" ")
|
|
}
|
|
|
|
out.WriteString(in)
|
|
|
|
for i = 0; i < n; i++ {
|
|
out.WriteString(" ")
|
|
}
|
|
|
|
return out.String()
|
|
}
|
|
|
|
func splitText(s string) []string {
|
|
var lines []string
|
|
|
|
sc := bufio.NewScanner(strings.NewReader(s))
|
|
for sc.Scan() {
|
|
lines = append(lines, sc.Text())
|
|
}
|
|
|
|
return lines
|
|
}
|
|
|
|
func getInfoModal() *tview.Modal {
|
|
modal := tview.NewModal()
|
|
modal.SetText("\n\nProcessing. Please wait...").
|
|
SetBackgroundColor(tcell.ColorSpecial).
|
|
SetTextColor(tcell.ColorDefault)
|
|
modal.Box.SetBackgroundColor(tcell.ColorSpecial)
|
|
return modal
|
|
}
|
|
|
|
func getActionModal() *primitive.ActionModal {
|
|
return primitive.NewActionModal().
|
|
SetBackgroundColor(tcell.ColorSpecial).
|
|
SetButtonBackgroundColor(tcell.ColorDarkCyan).
|
|
SetTextColor(tcell.ColorDefault)
|
|
}
|
|
|
|
// IsDumbTerminal checks TERM/WT_SESSION environment variable and returns true if they indicate a dumb terminal.
|
|
//
|
|
// Dumb terminal indicates terminal with limited capability. It may not provide support
|
|
// for special character sequences, e.g., no handling of ANSI escape sequences.
|
|
func IsDumbTerminal() bool {
|
|
term := strings.ToLower(os.Getenv("TERM"))
|
|
_, wtSession := os.LookupEnv("WT_SESSION")
|
|
return !wtSession && (term == "" || term == "dumb")
|
|
}
|
|
|
|
// IsNotTTY returns true if the stdout file descriptor is not a TTY.
|
|
func IsNotTTY() bool {
|
|
return !isatty.IsTerminal(os.Stdout.Fd())
|
|
}
|
|
|
|
// GetPager returns configured pager.
|
|
func GetPager() string {
|
|
if runtime.GOOS == "windows" {
|
|
return ""
|
|
}
|
|
if IsDumbTerminal() {
|
|
return "cat"
|
|
}
|
|
pager := os.Getenv("JIRA_PAGER")
|
|
if pager == "" {
|
|
pgr := os.Getenv("PAGER")
|
|
if pgr == "" {
|
|
pager = "less"
|
|
} else {
|
|
pager = pgr
|
|
}
|
|
}
|
|
return pager
|
|
}
|
|
|
|
// PagerOut outputs to configured pager if possible.
|
|
func PagerOut(out string) error {
|
|
pagerCmd := GetPager()
|
|
if pagerCmd == "" {
|
|
_, err := fmt.Print(out)
|
|
return err
|
|
}
|
|
|
|
pa := strings.Split(pagerCmd, " ")
|
|
pager, pagerArgs := pa[0], pa[1:]
|
|
if err := cmdExists(pager); err != nil {
|
|
return err
|
|
}
|
|
|
|
pagerEnv := os.Environ()
|
|
for i := len(pagerEnv) - 1; i >= 0; i-- {
|
|
if strings.HasPrefix(pagerEnv[i], "PAGER=") {
|
|
pagerEnv = append(pagerEnv[0:i], pagerEnv[i+1:]...)
|
|
}
|
|
}
|
|
if _, ok := os.LookupEnv("LESS"); !ok {
|
|
pagerEnv = append(pagerEnv, "LESS=R")
|
|
}
|
|
|
|
cmd := exec.Command(pager, pagerArgs...)
|
|
cmd.Env = pagerEnv
|
|
cmd.Stdin = strings.NewReader(out)
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
|
|
return cmd.Run()
|
|
}
|
|
|
|
func cmdExists(cmd string) error {
|
|
_, err := safeexec.LookPath(cmd)
|
|
return err
|
|
}
|
|
|
|
func customTUIStyle(style TableStyle) tcell.Style {
|
|
bg, ok := tcell.ColorNames[style.SelectionBackground]
|
|
if !ok {
|
|
bg = tcell.ColorDefault
|
|
}
|
|
fg, ok := tcell.ColorNames[style.SelectionForeground]
|
|
if !ok {
|
|
fg = tcell.ColorDarkOliveGreen
|
|
}
|
|
return tcell.StyleDefault.
|
|
Background(bg).
|
|
Foreground(fg).
|
|
Bold(style.SelectionTextIsBold)
|
|
}
|