Implement Job Configuration Ordering in Job Form

- Added functionality to allow users to select and reorder job configurations in both new and edit job forms.
- Introduced JavaScript logic to handle the display and ordering of selected configurations, including move up/down buttons.
- Updated backend to process and store the order of configurations when creating or updating jobs.
- Enhanced logging for job creation and update processes to include configuration order details.
This commit is contained in:
StarFleetCPTN
2025-03-20 20:39:26 -07:00
parent 73362793ad
commit 9a49d87777
4 changed files with 438 additions and 57 deletions
+168 -40
View File
@@ -2,8 +2,10 @@ package handlers
import (
"fmt"
"log"
"net/http"
"strconv"
"strings"
"github.com/gin-gonic/gin"
"github.com/starfleetcptn/gomft/components"
@@ -141,6 +143,9 @@ func (h *Handlers) HandleEditJob(c *gin.Context) {
func (h *Handlers) HandleCreateJob(c *gin.Context) {
userID := c.GetUint("userID")
// Debug logging
log.Printf("HandleCreateJob: Form data received: %v", c.Request.PostForm)
// Parse form data
var job db.Job
if err := c.ShouldBind(&job); err != nil {
@@ -148,6 +153,9 @@ func (h *Handlers) HandleCreateJob(c *gin.Context) {
return
}
// Debug logging
log.Printf("HandleCreateJob: Job after binding: %+v", job)
// Get multiple config IDs from form
configIDs := c.PostFormArray("config_ids[]")
if len(configIDs) == 0 {
@@ -155,35 +163,83 @@ func (h *Handlers) HandleCreateJob(c *gin.Context) {
return
}
// Debug logging
log.Printf("HandleCreateJob: config_ids[]: %v", configIDs)
// Process config IDs
var configIDsList []uint
for _, configIDStr := range configIDs {
configID, err := strconv.ParseUint(configIDStr, 10, 32)
if err != nil {
c.String(http.StatusBadRequest, "Invalid configuration ID format")
return
}
// Verify that the config exists and belongs to the user
var config db.TransferConfig
if err := h.DB.First(&config, configID).Error; err != nil {
c.String(http.StatusBadRequest, "Invalid configuration selected")
return
}
// Check if we have an explicit order specified
configOrder := c.PostForm("config_order")
log.Printf("HandleCreateJob: config_order: %s", configOrder)
// Check if the config belongs to the user
if config.CreatedBy != userID {
// Check if user is admin
isAdmin, exists := c.Get("isAdmin")
if !exists || isAdmin != true {
c.String(http.StatusForbidden, "You do not have permission to use this configuration")
if configOrder != "" {
// Parse the ordered list
orderStrings := strings.Split(configOrder, ",")
log.Printf("HandleCreateJob: order strings: %v", orderStrings)
for _, configIDStr := range orderStrings {
configID, err := strconv.ParseUint(configIDStr, 10, 32)
if err != nil {
log.Printf("HandleCreateJob: Error parsing config ID: %v", err)
c.String(http.StatusBadRequest, "Invalid configuration ID format in order")
return
}
}
configIDsList = append(configIDsList, uint(configID))
// Verify that the config exists and belongs to the user
var config db.TransferConfig
if err := h.DB.First(&config, configID).Error; err != nil {
log.Printf("HandleCreateJob: Invalid config ID: %d, error: %v", configID, err)
c.String(http.StatusBadRequest, "Invalid configuration selected")
return
}
// Check if the config belongs to the user
if config.CreatedBy != userID {
// Check if user is admin
isAdmin, exists := c.Get("isAdmin")
if !exists || isAdmin != true {
c.String(http.StatusForbidden, "You do not have permission to use this configuration")
return
}
}
configIDsList = append(configIDsList, uint(configID))
}
} else {
// Fall back to unordered config IDs
log.Printf("HandleCreateJob: No config_order found, using checkbox order")
for _, configIDStr := range configIDs {
configID, err := strconv.ParseUint(configIDStr, 10, 32)
if err != nil {
c.String(http.StatusBadRequest, "Invalid configuration ID format")
return
}
// Verify that the config exists and belongs to the user
var config db.TransferConfig
if err := h.DB.First(&config, configID).Error; err != nil {
c.String(http.StatusBadRequest, "Invalid configuration selected")
return
}
// Check if the config belongs to the user
if config.CreatedBy != userID {
// Check if user is admin
isAdmin, exists := c.Get("isAdmin")
if !exists || isAdmin != true {
c.String(http.StatusForbidden, "You do not have permission to use this configuration")
return
}
}
configIDsList = append(configIDsList, uint(configID))
}
}
// Debug logging
log.Printf("HandleCreateJob: Final configIDsList: %v", configIDsList)
// Set the first config ID for backward compatibility
if len(configIDsList) > 0 {
job.ConfigID = configIDsList[0]
@@ -214,6 +270,10 @@ func (h *Handlers) HandleCreateJob(c *gin.Context) {
// Set the config IDs list
job.SetConfigIDsList(configIDsList)
// Debug logging
log.Printf("HandleCreateJob: Job after setting ConfigIDsList: %+v", job)
log.Printf("HandleCreateJob: Job.ConfigIDs: %s", job.ConfigIDs)
// Set the boolean fields - handle both "on" and "true" values for checkboxes
enabledVal := c.Request.FormValue("enabled")
jobEnabledValue := enabledVal == "on" || enabledVal == "true"
@@ -239,10 +299,13 @@ func (h *Handlers) HandleCreateJob(c *gin.Context) {
// Create the job
if err := h.DB.CreateJob(&job); err != nil {
log.Printf("HandleCreateJob: Error creating job: %v", err)
c.String(http.StatusInternalServerError, "Failed to create job")
return
}
log.Printf("HandleCreateJob: Job successfully created with ID: %d", job.ID)
// Schedule the job with the scheduler
if err := h.Scheduler.ScheduleJob(&job); err != nil {
c.String(http.StatusInternalServerError, "Job created but scheduling failed: "+err.Error())
@@ -257,8 +320,13 @@ func (h *Handlers) HandleUpdateJob(c *gin.Context) {
id := c.Param("id")
userID := c.GetUint("userID")
// Debug logging
log.Printf("HandleUpdateJob: Updating job ID: %s", id)
log.Printf("HandleUpdateJob: Form data received: %v", c.Request.PostForm)
var job db.Job
if err := h.DB.First(&job, id).Error; err != nil {
log.Printf("HandleUpdateJob: Job not found: %v", err)
c.String(http.StatusNotFound, "Job not found")
return
}
@@ -275,49 +343,102 @@ func (h *Handlers) HandleUpdateJob(c *gin.Context) {
// Get the old job values for comparison
oldJob := job
log.Printf("HandleUpdateJob: Original job: %+v", oldJob)
log.Printf("HandleUpdateJob: Original job ConfigIDs: %s", oldJob.ConfigIDs)
// Parse form data
if err := c.ShouldBind(&job); err != nil {
log.Printf("HandleUpdateJob: Error binding form data: %v", err)
c.String(http.StatusBadRequest, "Invalid form data")
return
}
log.Printf("HandleUpdateJob: Job after binding: %+v", job)
// Get multiple config IDs from form
configIDs := c.PostFormArray("config_ids[]")
if len(configIDs) == 0 {
log.Printf("HandleUpdateJob: No config_ids[] found in form data")
c.String(http.StatusBadRequest, "At least one configuration must be selected")
return
}
log.Printf("HandleUpdateJob: config_ids[]: %v", configIDs)
// Process config IDs
var configIDsList []uint
for _, configIDStr := range configIDs {
configID, err := strconv.ParseUint(configIDStr, 10, 32)
if err != nil {
c.String(http.StatusBadRequest, "Invalid configuration ID format")
return
}
// Verify that the config exists
var config db.TransferConfig
if err := h.DB.First(&config, configID).Error; err != nil {
c.String(http.StatusBadRequest, "Invalid configuration selected")
return
}
// Check if we have an explicit order specified
configOrder := c.PostForm("config_order")
log.Printf("HandleUpdateJob: config_order: %s", configOrder)
// Check if the config belongs to the user
if config.CreatedBy != userID {
// Check if user is admin
isAdmin, exists := c.Get("isAdmin")
if !exists || isAdmin != true {
c.String(http.StatusForbidden, "You do not have permission to use this configuration")
if configOrder != "" {
// Parse the ordered list
orderStrings := strings.Split(configOrder, ",")
log.Printf("HandleUpdateJob: order strings: %v", orderStrings)
for _, configIDStr := range orderStrings {
configID, err := strconv.ParseUint(configIDStr, 10, 32)
if err != nil {
log.Printf("HandleUpdateJob: Error parsing config ID: %v", err)
c.String(http.StatusBadRequest, "Invalid configuration ID format in order")
return
}
}
configIDsList = append(configIDsList, uint(configID))
// Verify that the config exists
var config db.TransferConfig
if err := h.DB.First(&config, configID).Error; err != nil {
log.Printf("HandleUpdateJob: Invalid config ID: %d, error: %v", configID, err)
c.String(http.StatusBadRequest, "Invalid configuration selected")
return
}
// Check if the config belongs to the user
if config.CreatedBy != userID {
// Check if user is admin
isAdmin, exists := c.Get("isAdmin")
if !exists || isAdmin != true {
c.String(http.StatusForbidden, "You do not have permission to use this configuration")
return
}
}
configIDsList = append(configIDsList, uint(configID))
}
} else {
// Fall back to unordered config IDs
log.Printf("HandleUpdateJob: No config_order found, using checkbox order")
for _, configIDStr := range configIDs {
configID, err := strconv.ParseUint(configIDStr, 10, 32)
if err != nil {
c.String(http.StatusBadRequest, "Invalid configuration ID format")
return
}
// Verify that the config exists
var config db.TransferConfig
if err := h.DB.First(&config, configID).Error; err != nil {
c.String(http.StatusBadRequest, "Invalid configuration selected")
return
}
// Check if the config belongs to the user
if config.CreatedBy != userID {
// Check if user is admin
isAdmin, exists := c.Get("isAdmin")
if !exists || isAdmin != true {
c.String(http.StatusForbidden, "You do not have permission to use this configuration")
return
}
}
configIDsList = append(configIDsList, uint(configID))
}
}
// Debug logging
log.Printf("HandleUpdateJob: Final configIDsList: %v", configIDsList)
// Set the first config ID for backward compatibility
if len(configIDsList) > 0 {
job.ConfigID = configIDsList[0]
@@ -332,6 +453,10 @@ func (h *Handlers) HandleUpdateJob(c *gin.Context) {
// Set the config IDs list
job.SetConfigIDsList(configIDsList)
// Debug logging
log.Printf("HandleUpdateJob: Job after setting ConfigIDsList: %+v", job)
log.Printf("HandleUpdateJob: Job.ConfigIDs: %s", job.ConfigIDs)
// Set the boolean fields - handle both "on" and "true" values for checkboxes
enabledVal := c.Request.FormValue("enabled")
jobEnabledValue := enabledVal == "on" || enabledVal == "true"
@@ -357,10 +482,13 @@ func (h *Handlers) HandleUpdateJob(c *gin.Context) {
job.Config = db.TransferConfig{}
if err := h.DB.UpdateJob(&job); err != nil {
log.Printf("HandleUpdateJob: Error updating job: %v", err)
c.String(http.StatusInternalServerError, "Failed to update job")
return
}
log.Printf("HandleUpdateJob: Job successfully updated")
// Reschedule the job with the scheduler
if err := h.Scheduler.ScheduleJob(&job); err != nil {
c.String(http.StatusInternalServerError, "Job updated but scheduling failed: "+err.Error())