diff --git a/cmd/qfs/main.go b/cmd/qfs/main.go index 3928ac8..6bf6bf2 100644 --- a/cmd/qfs/main.go +++ b/cmd/qfs/main.go @@ -1166,7 +1166,8 @@ func setupRouter(cfg *config.Config, local *localdb.LocalDB, connMgr *db.Connect search := strings.ToLower(strings.TrimSpace(c.Query("search"))) author := strings.ToLower(strings.TrimSpace(c.Query("author"))) page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) - perPage, _ := strconv.Atoi(c.DefaultQuery("per_page", "10")) + // Return all projects by default (set high limit for configs to reference) + perPage, _ := strconv.Atoi(c.DefaultQuery("per_page", "1000")) sortField := strings.ToLower(strings.TrimSpace(c.DefaultQuery("sort", "created_at"))) sortDir := strings.ToLower(strings.TrimSpace(c.DefaultQuery("dir", "desc"))) if status != "active" && status != "archived" && status != "all" { @@ -1318,6 +1319,32 @@ func setupRouter(cfg *config.Config, local *localdb.LocalDB, connMgr *db.Connect }) }) + + // GET /api/projects/all - Returns all projects without pagination for UI dropdowns + projects.GET("/all", func(c *gin.Context) { + allProjects, err := projectService.ListByUser(dbUsername, true) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + // Return simplified list of all projects (UUID + Name only) + type ProjectSimple struct { + UUID string `json:"uuid"` + Name string `json:"name"` + } + + simplified := make([]ProjectSimple, 0, len(allProjects)) + for _, p := range allProjects { + simplified = append(simplified, ProjectSimple{ + UUID: p.UUID, + Name: p.Name, + }) + } + + c.JSON(http.StatusOK, simplified) + }) + projects.POST("", func(c *gin.Context) { var req services.CreateProjectRequest if err := c.ShouldBindJSON(&req); err != nil { diff --git a/web/templates/configs.html b/web/templates/configs.html index 6aba590..6e0992d 100644 --- a/web/templates/configs.html +++ b/web/templates/configs.html @@ -835,12 +835,17 @@ async function loadProjectsForConfigUI() { projectsCache = []; projectNameByUUID = {}; try { - const resp = await fetch('/api/projects?status=all'); + // Use /api/projects/all to get all projects without pagination + const resp = await fetch('/api/projects/all'); if (!resp.ok) return; const data = await resp.json(); - projectsCache = (data.projects || []); + // data is now a simple array of {uuid, name} objects + const allProjects = Array.isArray(data) ? data : (data.projects || []); - projectsCache.forEach(project => { + // For compatibility with rest of code, populate projectsCache but mainly use projectNameByUUID + projectsCache = allProjects; + + allProjects.forEach(project => { projectNameByUUID[project.uuid] = project.name; });