From 0b1b962ab01c6ff8a5d96d1528f945ceff194d31 Mon Sep 17 00:00:00 2001 From: Myers Carpenter Date: Sun, 29 Mar 2026 23:38:06 +0000 Subject: [PATCH] Refactor column picker to use generic combo list rerender Address review feedback from bircni and wxiaoguang: - Add rerender(items, selectedValue) method to IssueSidebarComboList so any picker can dynamically rebuild its menu. This replaces the one-off renderColumnPicker function with a framework-level capability. - Convert the column picker template to use the standard issue-sidebar-combo structure, so it is initialized by the existing queryElems loop alongside milestone/label/assignee pickers. - Move projectColumnInfo struct to package level (bircni) - Handle ProjectColumnID and MustDefaultColumn errors (bircni) - Remove custom Fomantic dropdown setup and DOM manipulation The rerender method is designed to support future multi-project use: each project's column picker can independently rerender when its parent project selection changes. --- routers/web/repo/projects.go | 29 ++++--- .../repo/issue/sidebar/project_column.tmpl | 44 +++++----- .../features/repo-issue-sidebar-combolist.ts | 23 +++++ .../js/features/repo-issue-sidebar-project.ts | 83 ++++--------------- 4 files changed, 80 insertions(+), 99 deletions(-) diff --git a/routers/web/repo/projects.go b/routers/web/repo/projects.go index 079cc9521d..483598d558 100644 --- a/routers/web/repo/projects.go +++ b/routers/web/repo/projects.go @@ -36,6 +36,11 @@ const ( tplProjectsView templates.TplName = "repo/projects/view" ) +type projectColumnInfo struct { + ID int64 `json:"id"` + Title string `json:"title"` +} + // MustEnableRepoProjects check if repo projects are enabled in settings func MustEnableRepoProjects(ctx *context.Context) { if unit.TypeProjects.UnitGlobalDisabled() { @@ -461,12 +466,6 @@ func UpdateIssueProject(ctx *context.Context) { } } - // Return columns for the new project so the sidebar column picker - // can update without a page reload. - type columnInfo struct { - ID int64 `json:"id"` - Title string `json:"title"` - } result := map[string]any{"ok": true} if projectID > 0 { project, err := project_model.GetProjectByID(ctx, projectID) @@ -479,25 +478,31 @@ func UpdateIssueProject(ctx *context.Context) { ctx.ServerError("GetProjectColumns", err) return } - cols := make([]columnInfo, 0, len(columns)) + cols := make([]projectColumnInfo, 0, len(columns)) for _, c := range columns { - cols = append(cols, columnInfo{ID: c.ID, Title: c.Title}) + cols = append(cols, projectColumnInfo{ID: c.ID, Title: c.Title}) } // The issue was assigned to the default column var selectedColumnID int64 if len(issues) > 0 { - selectedColumnID, _ = issues[0].ProjectColumnID(ctx) + selectedColumnID, err = issues[0].ProjectColumnID(ctx) + if err != nil { + ctx.ServerError("ProjectColumnID", err) + return + } if selectedColumnID == 0 { defaultColumn, err := project.MustDefaultColumn(ctx) - if err == nil { - selectedColumnID = defaultColumn.ID + if err != nil { + ctx.ServerError("MustDefaultColumn", err) + return } + selectedColumnID = defaultColumn.ID } } result["columns"] = cols result["selected_column_id"] = selectedColumnID } else { - result["columns"] = []columnInfo{} + result["columns"] = []projectColumnInfo{} result["selected_column_id"] = 0 } ctx.JSON(http.StatusOK, result) diff --git a/templates/repo/issue/sidebar/project_column.tmpl b/templates/repo/issue/sidebar/project_column.tmpl index fc9f294c9a..ea08d47d6c 100644 --- a/templates/repo/issue/sidebar/project_column.tmpl +++ b/templates/repo/issue/sidebar/project_column.tmpl @@ -1,29 +1,35 @@ {{$pageMeta := .}} {{$data := .ProjectsData}} -