diff --git a/weed/worker/tasks/vacuum/ui.go b/weed/worker/tasks/vacuum/ui.go index 6e58f0914..043bb6727 100644 --- a/weed/worker/tasks/vacuum/ui.go +++ b/weed/worker/tasks/vacuum/ui.go @@ -101,19 +101,19 @@ func (ui *UIProvider) RenderConfigForm(currentConfig interface{}) (template.HTML true, ) - form.AddDurationField( - "scan_interval", + form.AddIntervalField( + "scan_interval_seconds", "Scan Interval", "How often to scan for volumes needing vacuum", - secondsToDuration(config.ScanIntervalSeconds), + config.ScanIntervalSeconds, true, ) - form.AddDurationField( - "min_volume_age", + form.AddIntervalField( + "min_volume_age_seconds", "Minimum Volume Age", "Only vacuum volumes older than this duration", - secondsToDuration(config.MinVolumeAgeSeconds), + config.MinVolumeAgeSeconds, true, ) @@ -126,11 +126,11 @@ func (ui *UIProvider) RenderConfigForm(currentConfig interface{}) (template.HTML true, ) - form.AddDurationField( - "min_interval", + form.AddIntervalField( + "min_interval_seconds", "Minimum Interval", "Minimum time between vacuum operations on the same volume", - secondsToDuration(config.MinIntervalSeconds), + config.MinIntervalSeconds, true, ) @@ -158,10 +158,13 @@ function resetForm() { // Reset to default values document.querySelector('input[name="enabled"]').checked = true; document.querySelector('input[name="garbage_threshold"]').value = '30'; - document.querySelector('input[name="scan_interval"]').value = '30m'; - document.querySelector('input[name="min_volume_age"]').value = '1h'; + document.querySelector('input[name="scan_interval_seconds_value"]').value = '30'; + document.querySelector('select[name="scan_interval_seconds_unit"]').value = 'minute'; + document.querySelector('input[name="min_volume_age_seconds_value"]').value = '1'; + document.querySelector('select[name="min_volume_age_seconds_unit"]').value = 'hour'; document.querySelector('input[name="max_concurrent"]').value = '2'; - document.querySelector('input[name="min_interval"]').value = '6h'; + document.querySelector('input[name="min_interval_seconds_value"]').value = '6'; + document.querySelector('select[name="min_interval_seconds_unit"]').value = 'hour'; } } @@ -189,21 +192,35 @@ func (ui *UIProvider) ParseConfigForm(formData map[string][]string) (interface{} } // Parse scan interval - if intervalStr := formData["scan_interval"]; len(intervalStr) > 0 { - if interval, err := time.ParseDuration(intervalStr[0]); err != nil { - return nil, fmt.Errorf("invalid scan interval: %w", err) - } else { - config.ScanIntervalSeconds = durationToSeconds(interval) + if values, ok := formData["scan_interval_seconds_value"]; ok && len(values) > 0 { + value, err := strconv.Atoi(values[0]) + if err != nil { + return nil, fmt.Errorf("invalid scan interval value: %w", err) + } + + unit := "minute" // default + if units, ok := formData["scan_interval_seconds_unit"]; ok && len(units) > 0 { + unit = units[0] } + + // Convert to seconds using the helper function from types package + config.ScanIntervalSeconds = types.IntervalValueUnitToSeconds(value, unit) } // Parse min volume age - if ageStr := formData["min_volume_age"]; len(ageStr) > 0 { - if age, err := time.ParseDuration(ageStr[0]); err != nil { - return nil, fmt.Errorf("invalid min volume age: %w", err) - } else { - config.MinVolumeAgeSeconds = durationToSeconds(age) + if values, ok := formData["min_volume_age_seconds_value"]; ok && len(values) > 0 { + value, err := strconv.Atoi(values[0]) + if err != nil { + return nil, fmt.Errorf("invalid min volume age value: %w", err) + } + + unit := "minute" // default + if units, ok := formData["min_volume_age_seconds_unit"]; ok && len(units) > 0 { + unit = units[0] } + + // Convert to seconds + config.MinVolumeAgeSeconds = types.IntervalValueUnitToSeconds(value, unit) } // Parse max concurrent @@ -218,12 +235,19 @@ func (ui *UIProvider) ParseConfigForm(formData map[string][]string) (interface{} } // Parse min interval - if intervalStr := formData["min_interval"]; len(intervalStr) > 0 { - if interval, err := time.ParseDuration(intervalStr[0]); err != nil { - return nil, fmt.Errorf("invalid min interval: %w", err) - } else { - config.MinIntervalSeconds = durationToSeconds(interval) + if values, ok := formData["min_interval_seconds_value"]; ok && len(values) > 0 { + value, err := strconv.Atoi(values[0]) + if err != nil { + return nil, fmt.Errorf("invalid min interval value: %w", err) } + + unit := "minute" // default + if units, ok := formData["min_interval_seconds_unit"]; ok && len(units) > 0 { + unit = units[0] + } + + // Convert to seconds + config.MinIntervalSeconds = types.IntervalValueUnitToSeconds(value, unit) } return config, nil