Show a colour-coded team picker instead of cycling with T
T used to silently cycle Model.activeTeamID through the caller's teams with no visible list of choices. It now opens a full picker (modelled on the existing user picker) listing every team plus "All teams", each with a stable identity colour from a new six-colour theme palette. The same colour now also shows as a bullet next to "team: <name>" in the header, so the active team stays visible without opening the picker. Adds an Identity palette to the theme package (six hues, skipping the ones that already mean firing/critical), Styles.TeamColor to pick one by team id, and identity_1..6 as theme-file tokens alongside the existing twelve so a fully custom theme can still set every token.
This commit is contained in:
+39
-5
@@ -46,6 +46,7 @@ const (
|
||||
modeSnooze
|
||||
modeConfirm
|
||||
modeUserPicker
|
||||
modeTeamPicker
|
||||
modeUserCreate
|
||||
modeUserNotifyEdit
|
||||
modeAPIKeyMenu
|
||||
@@ -253,11 +254,12 @@ type Model struct {
|
||||
// Teams. The server scopes everything to the caller's teams; activeTeamID
|
||||
// narrows the incident and alert lists to one of them, 0 meaning all. The
|
||||
// schedule is per team and always needs a concrete one, see scheduleTeam.
|
||||
teams []api.Team
|
||||
activeTeamID int64
|
||||
defaultTeam string // config's `team`, resolved on connect
|
||||
meID int64
|
||||
isAdmin bool
|
||||
teams []api.Team
|
||||
activeTeamID int64
|
||||
defaultTeam string // config's `team`, resolved on connect
|
||||
meID int64
|
||||
isAdmin bool
|
||||
teamPickerTable table.Model
|
||||
|
||||
// Sign-in. Until the server accepts a session the TUI is in modeLogin;
|
||||
// loginNote is a line the form shows above the fields (why we are here), and
|
||||
@@ -396,6 +398,9 @@ func NewModel(client *api.Client, serverURL string, refreshInterval time.Duratio
|
||||
pickerT := table.New(table.WithFocused(true), table.WithKeyMap(tableKeyMap()))
|
||||
pickerT.SetStyles(ts)
|
||||
|
||||
teamPickerT := table.New(table.WithFocused(true), table.WithKeyMap(tableKeyMap()))
|
||||
teamPickerT.SetStyles(ts)
|
||||
|
||||
manageT := table.New(table.WithFocused(true), table.WithKeyMap(tableKeyMap("d", "k", "p")))
|
||||
manageT.SetStyles(ts)
|
||||
|
||||
@@ -499,6 +504,7 @@ func NewModel(client *api.Client, serverURL string, refreshInterval time.Duratio
|
||||
scheduleWindow: window,
|
||||
scheduleTable: schedT,
|
||||
userPickerTable: pickerT,
|
||||
teamPickerTable: teamPickerT,
|
||||
userManageTable: manageT,
|
||||
userFormInputs: [2]textinput.Model{usernameIn, emailIn},
|
||||
ntfyTopicInput: topicIn,
|
||||
@@ -644,6 +650,20 @@ func (m *Model) rebuildUserPickerTable() {
|
||||
m.userPickerTable.SetHeight(tableHeight(m.height, 10))
|
||||
}
|
||||
|
||||
// rebuildTeamPickerTable lists "All teams" first, then each of the caller's
|
||||
// teams in the same order switchTeam / selectTeam use, so a row's position
|
||||
// always matches its place in m.teams.
|
||||
func (m *Model) rebuildTeamPickerTable() {
|
||||
m.teamPickerTable.SetColumns(teamPickerColumns(m.width))
|
||||
rows := make([]table.Row, 0, len(m.teams)+1)
|
||||
rows = append(rows, table.Row{m.styles.Muted.Render("●"), "All teams", ""})
|
||||
for _, t := range m.teams {
|
||||
rows = append(rows, table.Row{m.styles.TeamColor(t.ID).Render("●"), t.Name, t.Role})
|
||||
}
|
||||
setRows(&m.teamPickerTable, rows)
|
||||
m.teamPickerTable.SetHeight(tableHeight(m.height, 10))
|
||||
}
|
||||
|
||||
func (m *Model) rebuildUserManageTable() {
|
||||
m.userManageTable.SetColumns(userManageColumns(m.width))
|
||||
rows := make([]table.Row, len(m.users))
|
||||
@@ -903,6 +923,20 @@ func userPickerColumns(width int) []table.Column {
|
||||
}
|
||||
}
|
||||
|
||||
func teamPickerColumns(width int) []table.Column {
|
||||
dotW := 3
|
||||
roleW := 10
|
||||
nameW := width - dotW - roleW - 8
|
||||
if nameW < 15 {
|
||||
nameW = 15
|
||||
}
|
||||
return []table.Column{
|
||||
{Title: "", Width: dotW},
|
||||
{Title: "Team", Width: nameW},
|
||||
{Title: "Role", Width: roleW},
|
||||
}
|
||||
}
|
||||
|
||||
func userManageColumns(width int) []table.Column {
|
||||
createdW := 12
|
||||
usernameW := 25
|
||||
|
||||
Reference in New Issue
Block a user