package tui import ( "fmt" "strings" "charm.land/lipgloss/v2" "superwork-tui/internal/cc" ) // createModalWidth returns the outer width of the new-issue modal for a given // terminal width. func createModalWidth(termWidth int) int { width := 84 if termWidth > 0 && termWidth-8 < width { width = termWidth - 8 } if width < 40 { width = 40 } return width } // defaultProfileIdx picks the initially-selected profile, preferring the VSCode // default name "offical", else the first profile, else -1 (默认/none). func defaultProfileIdx(profiles []cc.ClaudeProfile) int { for i, p := range profiles { if p.Name == "offical" { return i } } if len(profiles) > 0 { return 0 } return -1 } func profileRadios(profiles []cc.ClaudeProfile, sel int) string { mark := func(on bool) string { if on { return "◉" } return "○" } parts := make([]string, 0, len(profiles)+1) for i, p := range profiles { parts = append(parts, mark(i == sel)+" "+p.Name) } parts = append(parts, mark(sel < 0)+" (默认)") return strings.Join(parts, " ") } // createView renders the new-issue modal (title + multi-line request textarea + // optional profile radios) centered over the board, matching the VSCode dialog. func (m Model) createView() string { bg := m.boardView() width := createModalWidth(m.width) innerW := width - 2 hint := lipgloss.NewStyle().Faint(true) block := func(s string) string { return lipgloss.NewStyle().Width(innerW).PaddingLeft(1).Render(s) } var parts []string parts = append(parts, block(lipgloss.NewStyle().Bold(true).Foreground(detailBorderColor).Render("新建工单"))) parts = append(parts, block("")) parts = append(parts, block(m.createArea.View())) if len(m.createImages) > 0 { parts = append(parts, block(hint.Render(fmt.Sprintf("已粘贴 %d 张图片", len(m.createImages))))) } if len(m.profilePickerProfiles) > 0 { parts = append(parts, block("")) parts = append(parts, block(hint.Render("配置文件 (Tab 切换):"))) parts = append(parts, block(profileRadios(m.profilePickerProfiles, m.createProfileIdx))) } parts = append(parts, block("")) parts = append(parts, block(hint.Render("Ctrl+S 确认 Ctrl+V 粘贴图片 Esc 取消"))) box := lipgloss.NewStyle(). Border(lipgloss.RoundedBorder()). BorderForeground(detailBorderColor). Width(width). Render(lipgloss.JoinVertical(lipgloss.Left, parts...)) return placeOverlayCenter(bg, box) }