File size: 5,590 Bytes
45d270d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
document.addEventListener('DOMContentLoaded', function() {
    const uploadForm = document.getElementById('uploadForm');
    const uploadBtn = document.getElementById('uploadBtn');
    const btnText = uploadBtn.querySelector('.btn-text');
    const loadingSpinner = uploadBtn.querySelector('.loading-spinner');
    const resultsSection = document.getElementById('resultsSection');
    const resultsContent = document.getElementById('resultsContent');
    const clearBtn = document.getElementById('clearBtn');
    const filenamesInput = document.getElementById('filenames');

    // Form submission handler
    uploadForm.addEventListener('submit', async function(e) {
        e.preventDefault();
        
        const filenames = filenamesInput.value.trim();
        if (!filenames) {
            alert('Please enter at least one filename');
            return;
        }

        // Show loading state
        setLoadingState(true);
        
        try {
            const formData = new FormData();
            formData.append('filenames', filenames);
            
            const response = await fetch('/upload', {
                method: 'POST',
                body: formData
            });
            
            if (!response.ok) {
                throw new Error(`HTTP error! status: ${response.status}`);
            }
            
            const results = await response.text();
            displayResults(results);
            
        } catch (error) {
            console.error('Upload error:', error);
            displayResults(`❌ Error: ${error.message}`);
        } finally {
            setLoadingState(false);
        }
    });

    // Clear results handler
    clearBtn.addEventListener('click', function() {
        resultsContent.textContent = '';
        resultsSection.style.display = 'none';
    });

    // Auto-resize textarea
    filenamesInput.addEventListener('input', function() {
        this.style.height = 'auto';
        this.style.height = Math.min(this.scrollHeight, 200) + 'px';
    });

    // Functions
    function setLoadingState(isLoading) {
        uploadBtn.disabled = isLoading;
        
        if (isLoading) {
            btnText.style.display = 'none';
            loadingSpinner.style.display = 'flex';
        } else {
            btnText.style.display = 'flex';
            loadingSpinner.style.display = 'none';
        }
    }

    function displayResults(results) {
        // Format results with proper styling
        const formattedResults = formatResults(results);
        resultsContent.innerHTML = formattedResults;
        resultsSection.style.display = 'block';
        
        // Scroll to results
        resultsSection.scrollIntoView({ 
            behavior: 'smooth', 
            block: 'start' 
        });
    }

    function formatResults(results) {
        if (!results) return '<span class="error">No results received</span>';
        
        return results.split('\n').map(line => {
            line = line.trim();
            if (!line) return '';
            
            if (line.startsWith('✅')) {
                return `<div class="success">${escapeHtml(line)}</div>`;
            } else if (line.startsWith('❌')) {
                return `<div class="error">${escapeHtml(line)}</div>`;
            } else if (line.startsWith('⏩')) {
                return `<div class="warning">${escapeHtml(line)}</div>`;
            } else {
                return `<div>${escapeHtml(line)}</div>`;
            }
        }).join('');
    }

    function escapeHtml(text) {
        const div = document.createElement('div');
        div.textContent = text;
        return div.innerHTML;
    }

    // Add some interactive effects
    const uploadCard = document.querySelector('.upload-card');
    
    // Add subtle hover effect to form elements
    const formElements = document.querySelectorAll('input, textarea, button');
    formElements.forEach(element => {
        element.addEventListener('focus', function() {
            uploadCard.style.transform = 'translateY(-2px)';
        });
        
        element.addEventListener('blur', function() {
            uploadCard.style.transform = 'translateY(-5px)';
        });
    });

    // Add keyboard shortcuts
    document.addEventListener('keydown', function(e) {
        // Ctrl/Cmd + Enter to submit form
        if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {
            e.preventDefault();
            uploadForm.dispatchEvent(new Event('submit'));
        }
        
        // Escape to clear results
        if (e.key === 'Escape' && resultsSection.style.display !== 'none') {
            clearBtn.click();
        }
    });

    // Add tooltip for keyboard shortcuts
    const tooltip = document.createElement('div');
    tooltip.innerHTML = `

        <div style="position: fixed; bottom: 20px; right: 20px; background: rgba(0,0,0,0.8); color: white; padding: 10px; border-radius: 8px; font-size: 0.8rem; z-index: 1000;">

            <div><kbd>Ctrl+Enter</kbd> Submit form</div>

            <div><kbd>Esc</kbd> Clear results</div>

        </div>

    `;
    
    // Show tooltip on first visit
    setTimeout(() => {
        document.body.appendChild(tooltip);
        setTimeout(() => {
            tooltip.style.opacity = '0';
            tooltip.style.transition = 'opacity 0.5s';
            setTimeout(() => tooltip.remove(), 500);
        }, 3000);
    }, 1000);
});