Function bodies 285 total
tui.sortBySize function · go · L76-L85 (10 LOC)internal/ui/tui/table_sort.go
func sortBySize(rows []table.Row, colIdx int, asc bool) {
slices.SortFunc(rows, func(a, b table.Row) int {
av, _ := parseSize(a[colIdx])
bv, _ := parseSize(b[colIdx])
if asc {
return int(av - bv)
}
return int(bv - av)
})
}tui.parseSize function · go · L89-L116 (28 LOC)internal/ui/tui/table_sort.go
func parseSize(s string) (int64, error) {
s = strings.TrimSpace(s)
if s == "" {
return 0, nil
}
n := len(s)
if n == 0 {
return 0, nil
}
last := s[n-1]
var mult float64 = 1
switch last {
case 'B', 'b':
mult = 1e9
s = s[:n-1]
case 'M', 'm':
mult = 1e6
s = s[:n-1]
case 'T', 't':
mult = 1e12
s = s[:n-1]
}
num, err := strconv.ParseFloat(strings.TrimSpace(s), 64)
if err != nil {
return 0, err
}
return int64(num*mult + 0.5), nil // round to nearest int
}tui.sortByString function · go · L118-L125 (8 LOC)internal/ui/tui/table_sort.go
func sortByString(rows []table.Row, colIdx int, asc bool) {
slices.SortFunc(rows, func(a, b table.Row) int {
if asc {
return strings.Compare(a[colIdx], b[colIdx])
}
return strings.Compare(b[colIdx], a[colIdx])
})
}tui.hasIntHeader function · go · L128-L135 (8 LOC)internal/ui/tui/table_sort.go
func hasIntHeader(m map[string]struct{}, header string) bool {
for k := range m {
if strings.EqualFold(k, header) {
return true
}
}
return false
}tui.parsePercent function · go · L138-L145 (8 LOC)internal/ui/tui/table_sort.go
func parsePercent(s string) (int64, error) {
s = strings.TrimSpace(strings.TrimSuffix(s, "%"))
f, err := strconv.ParseFloat(s, 64)
if err != nil {
return 0, err
}
return int64(f + 0.5), nil // round to nearest int
}tui.getHeaders function · go · L89-L94 (6 LOC)internal/ui/tui/table_utils.go
func getHeaders(category domain.Category) []header {
if headers, exists := headerDefinitions[category]; exists {
return headers
}
return nil
}tui.getTableRows function · go · L101-L116 (16 LOC)internal/ui/tui/table_utils.go
func getTableRows(dataset *models.Dataset, category domain.Category, context *domain.ToolkitContext, filter string, sortColumn string, sortAsc bool, faultyOnly bool) ([]table.Row, tableStats) {
if context != nil && !context.Category.IsScopeOf(category) {
context = nil
}
if handler, exists := categoryHandlers[category]; exists {
rows := handler(dataset, context, filter, faultyOnly)
if sortColumn != "" && len(rows) > 0 {
headers := getHeaders(category)
sortRows(rows, headers, sortColumn, sortAsc)
}
return rows, computeStats(category, rows)
}
return nil, nil
}Powered by Repobility — scan your code at https://repobility.com
tui.computeStats function · go · L119-L145 (27 LOC)internal/ui/tui/table_utils.go
func computeStats(category domain.Category, rows []table.Row) tableStats {
cols, ok := statsColumns[category]
if !ok || len(rows) == 0 {
return nil
}
headers := getHeaders(category)
idx := make(map[string]int)
for i, h := range headers {
idx[h.text] = i
}
totals := make(tableStats)
for _, col := range cols {
columnIdx, ok := idx[col]
if !ok {
return nil // header missing, bail out
}
sum := 0
for _, r := range rows {
v, err := strconv.Atoi(r[columnIdx])
if err == nil {
sum += v
}
}
totals[col] = sum
}
return totals
}tui.getItemKey function · go · L205-L222 (18 LOC)internal/ui/tui/table_utils.go
func getItemKey(category domain.Category, row table.Row) models.ItemKey {
if len(row) == 0 {
return nil
}
switch category {
case domain.Tenant, domain.LimitDefinition, domain.Environment, domain.ServiceTenancy,
domain.ConsolePropertyDefinition, domain.PropertyDefinition, domain.GpuPool,
domain.LimitRegionalOverride, domain.ConsolePropertyRegionalOverride,
domain.PropertyRegionalOverride, domain.ModelArtifact, domain.Alias, domain.BaseModel:
return row[0]
case domain.LimitTenancyOverride, domain.ConsolePropertyTenancyOverride,
domain.PropertyTenancyOverride, domain.GpuNode, domain.DedicatedAICluster:
return models.ScopedItemKey{Scope: row[1], Name: row[0]}
case domain.CategoryUnknown:
// exhaustive
}
return nil
}tui.findItem function · go · L228-L273 (46 LOC)internal/ui/tui/table_utils.go
func findItem(dataset *models.Dataset, category domain.Category, key models.ItemKey) any {
if key == nil {
return nil
}
switch category {
case domain.Tenant:
return findTenant(dataset, key)
case domain.LimitDefinition:
return findLimitDefinition(dataset, key)
case domain.ConsolePropertyDefinition:
return findConsolePropertyDefinition(dataset, key)
case domain.PropertyDefinition:
return findPropertyDefinition(dataset, key)
case domain.LimitTenancyOverride:
return findLimitTenancyOverride(dataset, key)
case domain.ConsolePropertyTenancyOverride:
return findConsolePropertyTenancyOverride(dataset, key)
case domain.PropertyTenancyOverride:
return findPropertyTenancyOverride(dataset, key)
case domain.LimitRegionalOverride:
return findLimitRegionalOverride(dataset, key)
case domain.ConsolePropertyRegionalOverride:
return findConsolePropertyRegionalOverride(dataset, key)
case domain.PropertyRegionalOverride:
return findPropertyRegionalOverride(dataset, key)
tui.findLimitTenancyOverride function · go · L291-L297 (7 LOC)internal/ui/tui/table_utils.go
func findLimitTenancyOverride(dataset *models.Dataset, key models.ItemKey) any {
k := key.(models.ScopedItemKey)
if items, ok := dataset.LimitTenancyOverrideMap[k.Scope]; ok {
return collections.FindByName(items, k.Name)
}
return nil
}tui.findConsolePropertyTenancyOverride function · go · L299-L305 (7 LOC)internal/ui/tui/table_utils.go
func findConsolePropertyTenancyOverride(dataset *models.Dataset, key models.ItemKey) any {
k := key.(models.ScopedItemKey)
if items, ok := dataset.ConsolePropertyTenancyOverrideMap[k.Scope]; ok {
return collections.FindByName(items, k.Name)
}
return nil
}tui.findPropertyTenancyOverride function · go · L307-L313 (7 LOC)internal/ui/tui/table_utils.go
func findPropertyTenancyOverride(dataset *models.Dataset, key models.ItemKey) any {
k := key.(models.ScopedItemKey)
if items, ok := dataset.PropertyTenancyOverrideMap[k.Scope]; ok {
return collections.FindByName(items, k.Name)
}
return nil
}tui.findModelArtifact function · go · L331-L339 (9 LOC)internal/ui/tui/table_utils.go
func findModelArtifact(dataset *models.Dataset, key models.ItemKey) any {
k := key.(string)
for _, value := range dataset.ModelArtifactMap {
if item := collections.FindByName(value, k); item != nil {
return item
}
}
return nil
}tui.findGpuNode function · go · L353-L359 (7 LOC)internal/ui/tui/table_utils.go
func findGpuNode(dataset *models.Dataset, key models.ItemKey) any {
k := key.(models.ScopedItemKey)
if items, ok := dataset.GpuNodeMap[k.Scope]; ok {
return collections.FindByName(items, k.Name)
}
return nil
}Repobility · severity-and-effort ranking · https://repobility.com
tui.findDedicatedAICluster function · go · L361-L367 (7 LOC)internal/ui/tui/table_utils.go
func findDedicatedAICluster(dataset *models.Dataset, key models.ItemKey) any {
k := key.(models.ScopedItemKey)
if items, ok := dataset.DedicatedAIClusterMap[k.Scope]; ok {
return collections.FindByName(items, k.Name)
}
return nil
}tui.deleteItem function · go · L369-L382 (14 LOC)internal/ui/tui/table_utils.go
func deleteItem(dataset *models.Dataset, category domain.Category, key models.ItemKey) {
if key == nil {
return
}
switch category {
case domain.DedicatedAICluster:
deleteItemInMap(dataset.DedicatedAIClusterMap, key)
case domain.GpuNode:
deleteItemInMap(dataset.GpuNodeMap, key)
default:
// exhausive
}
}tui.getItemKeyString function · go · L397-L405 (9 LOC)internal/ui/tui/table_utils.go
func getItemKeyString(key models.ItemKey) string {
if k, ok := key.(string); ok {
return k
} else if k, ok := key.(models.ScopedItemKey); ok {
return fmt.Sprintf("%s/%s", k.Scope, k.Name)
}
return "UNKNOWN"
}tui.Model.updateDetailView method · go · L15-L39 (25 LOC)internal/ui/tui/update_detail.go
func (m *Model) updateDetailView(msg tea.Msg) (tea.Model, tea.Cmd) {
var cmds []tea.Cmd
if keyMsg, ok := msg.(tea.KeyMsg); ok {
switch {
case key.Matches(keyMsg, keys.Quit):
m.cancelInFlight()
return m, tea.Quit
case key.Matches(keyMsg, keys.Back, keys.ViewDetails):
m.exitDetailView()
case key.Matches(keyMsg, keys.CopyName):
item := findItem(m.dataset, m.category, m.choice)
cmds = append(cmds, m.copyItemNameCmd(item))
case key.Matches(keyMsg, keys.Help):
m.enterHelpView()
case key.Matches(keyMsg, keys.CopyObject):
cmds = append(cmds, m.copyItemJSONByChoice())
}
}
updatedViewport, cmd := m.viewport.Update(msg)
m.viewport = &updatedViewport
cmds = append(cmds, cmd)
return m, tea.Batch(cmds...)
}tui.Model.copyItemJSON method · go · L46-L58 (13 LOC)internal/ui/tui/update_detail.go
func (m *Model) copyItemJSON(item any) tea.Cmd {
return func() tea.Msg {
content, err := jsonutil.PrettyJSON(item)
if err != nil {
m.logger.Errorw("failed to convert item to JSON", "error", err)
return nil
}
if err := clipboard.WriteAll(content); err != nil {
m.logger.Errorw("failed to copy JSON to clipboard", "error", err)
}
return nil
}
}tui.Model.updateErrorView method · go · L22-L31 (10 LOC)internal/ui/tui/update_error.go
func (m *Model) updateErrorView(msg tea.Msg) (tea.Model, tea.Cmd) {
if msg, ok := msg.(tea.KeyMsg); ok {
if key.Matches(msg, keys.Quit) {
m.cancelInFlight()
return m, tea.Quit
}
}
return m, nil
}tui.Model.updateExportView method · go · L16-L48 (33 LOC)internal/ui/tui/update_export.go
func (m *Model) updateExportView(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg := msg.(type) {
case exportDoneMsg:
m.viewMode = common.ListView
return m, nil
case exportErrMsg:
m.err = fmt.Errorf("export failed: %w", msg.err)
m.viewMode = common.ErrorView
return m, nil
}
keyMsg, isKeyMsg := msg.(tea.KeyMsg)
if isKeyMsg {
switch {
case key.Matches(keyMsg, keys.ExportCSV):
m.viewMode = m.lastViewMode
return m, nil
case key.Matches(keyMsg, keys.Quit):
return m, tea.Quit
}
}
updated, cmd := m.dirPicker.Update(msg)
m.dirPicker = &updated
selected, selectedPath := m.dirPicker.DidSelectFile(msg)
if selected && isKeyMsg && key.Matches(keyMsg, keys.Confirm) {
exportPath := filepath.Join(selectedPath, m.exportFilename())
return m, m.exportTableCSVCmd(exportPath)
}
return m, cmd
}tui.Model.exportTableCSVCmd method · go · L50-L57 (8 LOC)internal/ui/tui/update_export.go
func (m *Model) exportTableCSVCmd(outPath string) tea.Cmd {
return func() tea.Msg {
if err := m.exportTableCSV(outPath); err != nil {
return exportErrMsg{err: err}
}
return exportDoneMsg{}
}
}If a scraper extracted this row, it came from Repobility (https://repobility.com)
tui.Model.exportView method · go · L63-L71 (9 LOC)internal/ui/tui/update_export.go
func (m *Model) exportView() string {
var s strings.Builder
s.WriteString("Export file name: ")
s.WriteString(m.dirPicker.Styles.Selected.Render(m.exportFilename()))
s.WriteString("\n\nPick an export path:\n\n")
s.WriteString(m.dirPicker.View() + "\n")
s.WriteString(m.exportHelpView())
return m.helpBorder.Width(m.viewWidth * 4 / 5).Render(s.String())
}tui.Model.exportHelpView method · go · L73-L80 (8 LOC)internal/ui/tui/update_export.go
func (m *Model) exportHelpView() string {
km := m.dirPicker.KeyMap
bindings := []key.Binding{
km.Up, km.Down, km.GoToTop, km.GoToLast,
km.PageUp, km.PageDown, km.Select, km.Open, km.Back,
}
return m.help.ShortHelpView(bindings)
}tui.Model.updateHelpView method · go · L10-L21 (12 LOC)internal/ui/tui/update_help.go
func (m *Model) updateHelpView(msg tea.Msg) (tea.Model, tea.Cmd) {
if keyMsg, ok := msg.(tea.KeyMsg); ok {
if key.Matches(keyMsg, keys.Back, keys.Help) {
m.viewMode = m.lastViewMode
} else if key.Matches(keyMsg, keys.Quit) {
m.cancelInFlight()
return m, tea.Quit
}
}
return m, nil
}tui.Model.updateListView method · go · L20-L27 (8 LOC)internal/ui/tui/update_list.go
func (m *Model) updateListView(msg tea.Msg) (tea.Model, tea.Cmd) {
cmds := m.routeListMsg(msg)
updatedTable, cmd := m.table.Update(msg)
m.table = &updatedTable
cmds = append(cmds, cmd)
return m, tea.Batch(cmds...)
}tui.Model.routeListMsg method · go · L29-L53 (25 LOC)internal/ui/tui/update_list.go
func (m *Model) routeListMsg(msg tea.Msg) []tea.Cmd {
switch msg := msg.(type) {
case tea.KeyMsg:
return m.handleKeyMsg(msg)
case DataMsg:
return []tea.Cmd{m.handleDataMsg(msg)}
case FilterMsg:
return []tea.Cmd{m.handleFilterMsg(msg)}
case SetFilterMsg:
return []tea.Cmd{m.handleSetFilterMsg(msg)}
case FilterApplyMsg:
return []tea.Cmd{m.handleFilterApplyMsg(msg)}
case deleteErrMsg:
m.handleDeleteErrMsg(msg)
return nil
case deleteDoneMsg:
m.handleDeleteDoneMsg(msg)
return nil
case updateDoneMsg:
m.handleUpdateDoneMsg(msg)
return nil
default:
return m.routeListAsyncMsg(msg)
}
}tui.Model.routeListAsyncMsg method · go · L55-L71 (17 LOC)internal/ui/tui/update_list.go
func (m *Model) routeListAsyncMsg(msg tea.Msg) []tea.Cmd {
switch msg := msg.(type) {
case gpuPoolScaleStartedMsg:
m.handleGpuPoolScaleStartedMsg(msg)
case gpuPoolScaleResultMsg:
m.handleGpuPoolScaleResultMsg(msg)
case cordonNodeResultMsg:
m.handleCordonNodeResultMsg(msg)
case drainNodeResultMsg:
m.handleDrainNodeResultMsg(msg)
case rebootNodeResultMsg:
m.handleRebootNodeResultMsg(msg)
default:
return m.routeListDataMsg(msg)
}
return nil
}tui.Model.routeListDataMsg method · go · L73-L85 (13 LOC)internal/ui/tui/update_list.go
func (m *Model) routeListDataMsg(msg tea.Msg) []tea.Cmd {
switch msg := msg.(type) {
case datasetLoadedMsg:
return []tea.Cmd{m.handleDataMsg(DataMsg{Data: msg.Dataset, Gen: msg.Gen})}
case baseModelsLoadedMsg:
m.handleBaseModelsLoaded(msg.Items, msg.Gen)
case gpuPoolsLoadedMsg:
return []tea.Cmd{m.handleGpuPoolsLoaded(msg.Items, msg.Gen)}
default:
return m.routeListMoreDataMsg(msg)
}
return nil
}tui.Model.routeListMoreDataMsg method · go · L87-L105 (19 LOC)internal/ui/tui/update_list.go
func (m *Model) routeListMoreDataMsg(msg tea.Msg) []tea.Cmd {
switch msg := msg.(type) {
case gpuNodesLoadedMsg:
m.handleGpuNodesLoaded(msg.Items, msg.Gen)
case dedicatedAIClustersLoadedMsg:
m.handleDedicatedAIClustersLoaded(msg.Items, msg.Gen)
case tenancyOverridesLoadedMsg:
m.handleTenancyOverridesLoaded(msg.Group, msg.Gen)
case limitRegionalOverridesLoadedMsg:
m.handleLimitRegionalOverridesLoaded(msg.Items, msg.Gen)
case consolePropertyRegionalOverridesLoadedMsg:
m.handleConsolePropertyRegionalOverridesLoaded(msg.Items, msg.Gen)
case propertyRegionalOverridesLoadedMsg:
m.handlePropertyRegionalOverridesLoaded(msg.Items, msg.Gen)
default:
// Future-proof: ignore unknown message types
}
return nil
}Repobility analyzer · published findings · https://repobility.com
tui.Model.handleKeyMsg method · go · L107-L121 (15 LOC)internal/ui/tui/update_list.go
func (m *Model) handleKeyMsg(msg tea.KeyMsg) []tea.Cmd {
var cmds []tea.Cmd
if key.Matches(msg, keys.Back) {
cmd := m.backToLastState()
if cmd != nil {
cmds = append(cmds, cmd)
}
}
if m.inputMode == common.NormalInput {
cmds = append(cmds, m.handleNormalKeys(msg)...)
} else {
cmds = append(cmds, m.handleEditKeys(msg)...)
}
return cmds
}tui.Model.handleSetFilterMsg method · go · L131-L140 (10 LOC)internal/ui/tui/update_list.go
func (m *Model) handleSetFilterMsg(msg SetFilterMsg) tea.Cmd {
val := string(msg)
m.textInput.SetValue(val)
normalized := strings.ToLower(val)
// Invalidate any pending debounce tick that may be in-flight.
m.filterNonce++
return func() tea.Msg {
return FilterMsg(normalized)
}
}tui.Model.handleFilterApplyMsg method · go · L142-L148 (7 LOC)internal/ui/tui/update_list.go
func (m *Model) handleFilterApplyMsg(msg FilterApplyMsg) tea.Cmd {
// Only apply if this tick corresponds to the most recent debounce
if msg.Nonce == m.filterNonce {
return filterTableAsync(m, msg.Value)
}
return nil
}tui.Model.handleNormalKeys method · go · L151-L189 (39 LOC)internal/ui/tui/update_list.go
func (m *Model) handleNormalKeys(msg tea.KeyMsg) []tea.Cmd {
var cmds []tea.Cmd
// Dispatch table for key handlers
keyHandlers := []struct {
match key.Binding
action func() []tea.Cmd
}{
{keys.Quit, func() []tea.Cmd { return []tea.Cmd{func() tea.Msg { m.cancelInFlight(); return tea.QuitMsg{} }} }},
{keys.BackHist, func() []tea.Cmd { return []tea.Cmd{m.moveHistory(-1)} }},
{keys.FwdHist, func() []tea.Cmd { return []tea.Cmd{m.moveHistory(1)} }},
{keys.NextCategory, func() []tea.Cmd { return []tea.Cmd{m.handleNextCategory()} }},
{keys.PrevCategory, func() []tea.Cmd { return []tea.Cmd{m.handlePrevCategory()} }},
{keys.FilterMode, func() []tea.Cmd { return []tea.Cmd{m.enterEditMode(common.FilterTarget)} }},
{keys.PasteFilter, func() []tea.Cmd { return []tea.Cmd{m.pasteFilter()} }},
{keys.CommandMode, func() []tea.Cmd { return []tea.Cmd{m.enterEditMode(common.AliasTarget)} }},
{keys.ViewDetails, func() []tea.Cmd { return []tea.Cmd{m.enterDetailView()} }},
{keys.Ctui.Model.deleteItem method · go · L195-L205 (11 LOC)internal/ui/tui/update_list.go
func (m *Model) deleteItem(itemKey models.ItemKey) tea.Cmd {
switch m.category {
case domain.DedicatedAICluster:
return m.deleteDedicatedAICluster(itemKey)
case domain.GpuNode:
return m.deleteGpuNode(itemKey)
default:
// exhausive
}
return nil
}tui.Model.deleteDedicatedAICluster method · go · L210-L239 (30 LOC)internal/ui/tui/update_list.go
func (m *Model) deleteDedicatedAICluster(itemKey models.ItemKey) tea.Cmd {
item := findItem(m.dataset, m.category, itemKey)
dac, ok := item.(*models.DedicatedAICluster)
if !ok || dac == nil {
m.logger.Errorw("item not found for delete operation", "category", m.category, "key", itemKey)
return nil
}
if dac.Status == "Deleting" {
return nil
}
prevState := dac.Status
dac.Status = "Deleting"
m.updateRows(false)
return func() tea.Msg {
ctx, cancel := m.opContext()
defer cancel()
if err := actions.DeleteDedicatedAICluster(ctx, dac, m.environment, m.logger); err != nil {
return deleteErrMsg{
err: err,
category: domain.DedicatedAICluster,
key: itemKey,
prevState: prevState,
}
}
return deleteDoneMsg{
category: domain.DedicatedAICluster,
key: itemKey,
}
}
}tui.Model.deleteGpuNode method · go · L241-L268 (28 LOC)internal/ui/tui/update_list.go
func (m *Model) deleteGpuNode(itemKey models.ItemKey) tea.Cmd {
item := findItem(m.dataset, m.category, itemKey)
node, ok := item.(*models.GpuNode)
if !ok || node == nil {
m.logger.Errorw("item not found for delete operation", "category", m.category, "key", itemKey)
return nil
}
if node.GetStatus() == "Deleting" {
return nil
}
node.SetStatus("Deleting")
m.updateRows(false)
return func() tea.Msg {
ctx, cancel := m.opContext()
defer cancel()
if err := actions.TerminateInstance(ctx, node, m.environment, m.logger); err != nil {
return deleteErrMsg{
err: err,
category: domain.GpuNode,
key: itemKey,
}
}
return deleteDoneMsg{
category: domain.GpuNode,
key: itemKey,
}
}
}tui.Model.rebootNode method · go · L270-L296 (27 LOC)internal/ui/tui/update_list.go
func (m *Model) rebootNode(item any) tea.Cmd {
if item == nil {
m.logger.Errorw("no item selected for reboot operation", "category", m.category)
return nil
}
node, ok := item.(*models.GpuNode)
if !ok {
m.logger.Errorw("unsupported item type for reboot operation", "item", item)
return nil
}
if node.GetStatus() == "Rebooting" {
return nil
}
itemKey := getItemKey(m.category, m.table.SelectedRow())
// optimistic UI
node.SetStatus("Rebooting")
m.updateRows(false)
return func() tea.Msg {
ctx, cancel := m.opContext()
defer cancel()
err := actions.SoftResetInstance(ctx, node, m.environment, m.logger)
return rebootNodeResultMsg{key: itemKey, err: err}
}
}Powered by Repobility — scan your code at https://repobility.com
tui.Model.handleDeleteErrMsg method · go · L298-L312 (15 LOC)internal/ui/tui/update_list.go
func (m *Model) handleDeleteErrMsg(msg deleteErrMsg) {
m.logger.Errorw("failed to delete item", "key", msg.key, "error", msg.err)
item := findItem(m.dataset, msg.category, msg.key)
if dac, ok := item.(*models.DedicatedAICluster); ok {
dac.Status = msg.prevState
} else if node, ok := item.(*models.GpuNode); ok {
node.SetStatus(msg.prevState)
}
// update view if current
if msg.category == m.category {
m.updateRows(false)
}
}tui.Model.handleDeleteDoneMsg method · go · L314-L325 (12 LOC)internal/ui/tui/update_list.go
func (m *Model) handleDeleteDoneMsg(msg deleteDoneMsg) {
deleteItem(m.dataset, msg.category, msg.key)
// update view if current
if msg.category == m.category {
idx := m.table.Cursor()
if idx+1 >= len(m.table.Rows()) {
m.table.MoveUp(1)
}
m.updateRows(false)
}
}tui.Model.handleUpdateDoneMsg method · go · L327-L339 (13 LOC)internal/ui/tui/update_list.go
func (m *Model) handleUpdateDoneMsg(msg updateDoneMsg) {
if msg.err != nil {
m.logger.Errorw("failed to update data", "category", msg.category, "error", msg.err)
for i := range m.dataset.GpuPools {
m.dataset.GpuPools[i].Status = "UNKNOWN"
}
}
// update view if current
if msg.category == m.category {
m.updateRows(false)
}
}tui.Model.handleGpuPoolScaleStartedMsg method · go · L341-L349 (9 LOC)internal/ui/tui/update_list.go
func (m *Model) handleGpuPoolScaleStartedMsg(msg gpuPoolScaleStartedMsg) {
item := findItem(m.dataset, domain.GpuPool, msg.key)
if pool, ok := item.(*models.GpuPool); ok && pool != nil {
pool.Status = "SCALING"
if m.category == domain.GpuPool {
m.updateRows(false)
}
}
}tui.Model.handleGpuPoolScaleResultMsg method · go · L351-L365 (15 LOC)internal/ui/tui/update_list.go
func (m *Model) handleGpuPoolScaleResultMsg(msg gpuPoolScaleResultMsg) {
item := findItem(m.dataset, domain.GpuPool, msg.key)
if pool, ok := item.(*models.GpuPool); ok && pool != nil {
if msg.err != nil {
m.logger.Errorw("failed to scale GPU pool", "key", msg.key, "error", msg.err)
pool.Status = "FAILED"
} else {
// Optimistic success state until enrichment updates the pool
pool.Status = "RUNNING"
}
if m.category == domain.GpuPool {
m.updateRows(false)
}
}
}tui.Model.handleCordonNodeResultMsg method · go · L367-L381 (15 LOC)internal/ui/tui/update_list.go
func (m *Model) handleCordonNodeResultMsg(msg cordonNodeResultMsg) {
item := findItem(m.dataset, domain.GpuNode, msg.key)
if node, ok := item.(*models.GpuNode); ok && node != nil {
if msg.err != nil {
m.logger.Errorw("failed to toggle cordon state", "key", msg.key, "error", msg.err)
} else {
node.IsSchedulingDisabled = msg.state
// Clear transient status so GetStatus reflects current state
node.SetStatus("")
}
if m.category == domain.GpuNode {
m.updateRows(false)
}
}
}tui.Model.handleDrainNodeResultMsg method · go · L383-L390 (8 LOC)internal/ui/tui/update_list.go
func (m *Model) handleDrainNodeResultMsg(msg drainNodeResultMsg) {
if msg.err != nil {
m.logger.Errorw("failed to drain node", "key", msg.key, "error", msg.err)
}
if m.category == domain.GpuNode {
m.updateRows(false)
}
}tui.Model.handleRebootNodeResultMsg method · go · L392-L406 (15 LOC)internal/ui/tui/update_list.go
func (m *Model) handleRebootNodeResultMsg(msg rebootNodeResultMsg) {
item := findItem(m.dataset, domain.GpuNode, msg.key)
if node, ok := item.(*models.GpuNode); ok && node != nil {
if msg.err != nil {
m.logger.Errorw("failed to reboot node", "key", msg.key, "error", msg.err)
node.SetStatus("FAILED")
} else {
// Clear transient "Rebooting" status to recompute via GetStatus()
node.SetStatus("")
}
}
if m.category == domain.GpuNode {
m.updateRows(false)
}
}Repobility · severity-and-effort ranking · https://repobility.com
tui.Model.toggleAliases method · go · L408-L413 (6 LOC)internal/ui/tui/update_list.go
func (m *Model) toggleAliases() []tea.Cmd {
if m.category == domain.Alias {
return []tea.Cmd{m.moveHistory(-1)}
}
return m.updateCategory(domain.Alias)
}tui.Model.enterExportView method · go · L415-L428 (14 LOC)internal/ui/tui/update_list.go
func (m *Model) enterExportView() []tea.Cmd {
m.lastViewMode = m.viewMode
m.viewMode = common.ExportView
var cmd tea.Cmd
if m.dirPicker.Path != "" {
cmd = func() tea.Msg {
return tea.KeyMsg{Type: tea.KeyType(tea.KeyBackspace)}
}
} else {
cmd = m.dirPicker.Init()
}
return []tea.Cmd{cmd}
}tui.Model.pasteFilter method · go · L430-L442 (13 LOC)internal/ui/tui/update_list.go
func (*Model) pasteFilter() tea.Cmd {
return func() tea.Msg {
clip, err := clipboard.ReadAll()
if err != nil {
return nil
}
clip = strings.TrimSpace(clip)
if clip == "" {
return nil
}
return SetFilterMsg(clip)
}
}