You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							160 lines
						
					
					
						
							6.1 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							160 lines
						
					
					
						
							6.1 KiB
						
					
					
				
								package app
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
								    "github.com/seaweedfs/seaweedfs/weed/admin/maintenance"
							 | 
						|
								    "github.com/seaweedfs/seaweedfs/weed/admin/view/components"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								// TaskConfigTemplData represents data for templ-based task configuration
							 | 
						|
								type TaskConfigTemplData struct {
							 | 
						|
								    TaskType    maintenance.MaintenanceTaskType
							 | 
						|
								    TaskName    string
							 | 
						|
								    TaskIcon    string
							 | 
						|
								    Description string
							 | 
						|
								    ConfigSections []components.ConfigSectionData
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								templ TaskConfigTempl(data *TaskConfigTemplData) {
							 | 
						|
								    <div class="container-fluid">
							 | 
						|
								        <div class="row mb-4">
							 | 
						|
								            <div class="col-12">
							 | 
						|
								                <div class="d-flex justify-content-between align-items-center">
							 | 
						|
								                    <h2 class="mb-0">
							 | 
						|
								                        <i class={data.TaskIcon + " me-2"}></i>
							 | 
						|
								                        {data.TaskName} Configuration
							 | 
						|
								                    </h2>
							 | 
						|
								                    <div class="btn-group">
							 | 
						|
								                        <a href="/maintenance/config" class="btn btn-outline-secondary">
							 | 
						|
								                            <i class="fas fa-arrow-left me-1"></i>
							 | 
						|
								                            Back to Configuration
							 | 
						|
								                        </a>
							 | 
						|
								                        <a href="/maintenance/queue" class="btn btn-outline-info">
							 | 
						|
								                            <i class="fas fa-list me-1"></i>
							 | 
						|
								                            View Queue
							 | 
						|
								                        </a>
							 | 
						|
								                    </div>
							 | 
						|
								                </div>
							 | 
						|
								            </div>
							 | 
						|
								        </div>
							 | 
						|
								
							 | 
						|
								        <div class="row mb-4">
							 | 
						|
								            <div class="col-12">
							 | 
						|
								                <div class="alert alert-info" role="alert">
							 | 
						|
								                    <i class="fas fa-info-circle me-2"></i>
							 | 
						|
								                    {data.Description}
							 | 
						|
								                </div>
							 | 
						|
								            </div>
							 | 
						|
								        </div>
							 | 
						|
								
							 | 
						|
								        <form method="POST" class="needs-validation" novalidate>
							 | 
						|
								            <!-- Render all configuration sections -->
							 | 
						|
								            for _, section := range data.ConfigSections {
							 | 
						|
								                @components.ConfigSection(section)
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            <!-- Form actions -->
							 | 
						|
								            <div class="row">
							 | 
						|
								                <div class="col-12">
							 | 
						|
								                    <div class="card">
							 | 
						|
								                        <div class="card-body">
							 | 
						|
								                            <div class="d-flex justify-content-between">
							 | 
						|
								                                <div>
							 | 
						|
								                                    <button type="submit" class="btn btn-primary">
							 | 
						|
								                                        <i class="fas fa-save me-1"></i>
							 | 
						|
								                                        Save Configuration
							 | 
						|
								                                    </button>
							 | 
						|
								                                    <button type="button" class="btn btn-outline-secondary ms-2" onclick="resetForm()">
							 | 
						|
								                                        <i class="fas fa-undo me-1"></i>
							 | 
						|
								                                        Reset
							 | 
						|
								                                    </button>
							 | 
						|
								                                </div>
							 | 
						|
								                                <div>
							 | 
						|
								                                    <button type="button" class="btn btn-outline-info" onclick="testConfiguration()">
							 | 
						|
								                                        <i class="fas fa-play me-1"></i>
							 | 
						|
								                                        Test Configuration
							 | 
						|
								                                    </button>
							 | 
						|
								                                </div>
							 | 
						|
								                            </div>
							 | 
						|
								                        </div>
							 | 
						|
								                    </div>
							 | 
						|
								                </div>
							 | 
						|
								            </div>
							 | 
						|
								        </form>
							 | 
						|
								    </div>
							 | 
						|
								
							 | 
						|
								    <script>
							 | 
						|
								        // Form validation
							 | 
						|
								        (function() {
							 | 
						|
								            'use strict';
							 | 
						|
								            window.addEventListener('load', function() {
							 | 
						|
								                var forms = document.getElementsByClassName('needs-validation');
							 | 
						|
								                var validation = Array.prototype.filter.call(forms, function(form) {
							 | 
						|
								                    form.addEventListener('submit', function(event) {
							 | 
						|
								                        if (form.checkValidity() === false) {
							 | 
						|
								                            event.preventDefault();
							 | 
						|
								                            event.stopPropagation();
							 | 
						|
								                        }
							 | 
						|
								                        form.classList.add('was-validated');
							 | 
						|
								                    }, false);
							 | 
						|
								                });
							 | 
						|
								            }, false);
							 | 
						|
								        })();
							 | 
						|
								
							 | 
						|
								        // Auto-save functionality
							 | 
						|
								        let autoSaveTimeout;
							 | 
						|
								        function autoSave() {
							 | 
						|
								            clearTimeout(autoSaveTimeout);
							 | 
						|
								            autoSaveTimeout = setTimeout(function() {
							 | 
						|
								                const formData = new FormData(document.querySelector('form'));
							 | 
						|
								                localStorage.setItem('task_config_' + '{data.TaskType}', JSON.stringify(Object.fromEntries(formData)));
							 | 
						|
								            }, 1000);
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        // Add auto-save listeners to all form inputs
							 | 
						|
								        document.addEventListener('DOMContentLoaded', function() {
							 | 
						|
								            const form = document.querySelector('form');
							 | 
						|
								            if (form) {
							 | 
						|
								                form.addEventListener('input', autoSave);
							 | 
						|
								                form.addEventListener('change', autoSave);
							 | 
						|
								            }
							 | 
						|
								        });
							 | 
						|
								
							 | 
						|
								        // Reset form function
							 | 
						|
								        function resetForm() {
							 | 
						|
								            if (confirm('Are you sure you want to reset all changes?')) {
							 | 
						|
								                location.reload();
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        // Test configuration function
							 | 
						|
								        function testConfiguration() {
							 | 
						|
								            const formData = new FormData(document.querySelector('form'));
							 | 
						|
								            
							 | 
						|
								            // Show loading state
							 | 
						|
								            const testBtn = document.querySelector('button[onclick="testConfiguration()"]');
							 | 
						|
								            const originalContent = testBtn.innerHTML;
							 | 
						|
								            testBtn.innerHTML = '<i class="fas fa-spinner fa-spin me-1"></i>Testing...';
							 | 
						|
								            testBtn.disabled = true;
							 | 
						|
								            
							 | 
						|
								            fetch('/maintenance/config/{data.TaskType}/test', {
							 | 
						|
								                method: 'POST',
							 | 
						|
								                body: formData
							 | 
						|
								            })
							 | 
						|
								            .then(response => response.json())
							 | 
						|
								            .then(data => {
							 | 
						|
								                if (data.success) {
							 | 
						|
								                    alert('Configuration test successful!');
							 | 
						|
								                } else {
							 | 
						|
								                    alert('Configuration test failed: ' + data.error);
							 | 
						|
								                }
							 | 
						|
								            })
							 | 
						|
								            .catch(error => {
							 | 
						|
								                alert('Test failed: ' + error);
							 | 
						|
								            })
							 | 
						|
								            .finally(() => {
							 | 
						|
								                testBtn.innerHTML = originalContent;
							 | 
						|
								                testBtn.disabled = false;
							 | 
						|
								            });
							 | 
						|
								        }
							 | 
						|
								    </script>
							 | 
						|
								} 
							 |