diff --git a/src/main.js b/src/main.js index 2176932..7eb9738 100644 --- a/src/main.js +++ b/src/main.js @@ -2554,50 +2554,104 @@ async function handleApplyPreset() { // Create custom preset async function handleCreatePreset() { - const name = prompt('Enter a name for your custom preset:'); - if (!name || !name.trim()) return; + // Check if form already exists + if (document.getElementById('preset-create-form')) return; - const description = prompt('Enter a description for your preset:'); - if (!description || !description.trim()) return; + const container = document.getElementById('presets-tab').querySelector('.roleplay-content'); + const createBtn = document.getElementById('create-preset-btn'); - const systemAdditions = prompt('Enter system additions (press Cancel to skip):', ''); - const authorsNoteDefault = prompt('Enter default Author\'s Note (press Cancel to skip):', ''); + // Create inline form + const formDiv = document.createElement('div'); + formDiv.id = 'preset-create-form'; + formDiv.style.background = 'var(--bg-secondary)'; + formDiv.style.border = '2px solid var(--accent)'; + formDiv.style.borderRadius = '8px'; + formDiv.style.padding = '16px'; + formDiv.style.marginBottom = '16px'; - try { - // Generate a simple ID from the name - const id = name.toLowerCase().replace(/[^a-z0-9]+/g, '-'); + formDiv.innerHTML = ` +
+
Create Custom Preset
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ `; - const preset = { - id: id, - name: name.trim(), - description: description.trim(), - system_additions: systemAdditions || '', - authors_note_default: authorsNoteDefault || '', - instructions: [], - format_hints: { - wi_format: '[{content}]', - scenario_format: '[Scenario: {content}]', - personality_format: '[{char}\'s personality: {content}]' - } - }; + container.insertBefore(formDiv, createBtn); + document.getElementById('preset-create-name').focus(); - await invoke('save_custom_preset', { preset }); + // Handle cancel + document.getElementById('preset-create-cancel').addEventListener('click', () => { + formDiv.remove(); + }); - setStatus('Custom preset created', 'success'); - setTimeout(() => setStatus('Ready'), 2000); + // Handle save + document.getElementById('preset-create-save').addEventListener('click', async () => { + const name = document.getElementById('preset-create-name').value.trim(); + const description = document.getElementById('preset-create-desc').value.trim(); + const systemAdditions = document.getElementById('preset-create-system').value.trim(); + const authorsNoteDefault = document.getElementById('preset-create-note').value.trim(); - // Reload presets - await loadPresets(); + if (!name || !description) { + alert('Name and description are required'); + return; + } - // Select the new preset - document.getElementById('preset-select').value = id; - await handlePresetSelect(id); - } catch (error) { - console.error('Failed to create preset:', error); - alert(`Failed to create preset: ${error}`); - setStatus('Failed to create preset', 'error'); - setTimeout(() => setStatus('Ready'), 2000); - } + try { + // Generate a simple ID from the name + const id = name.toLowerCase().replace(/[^a-z0-9]+/g, '-'); + + const preset = { + id: id, + name, + description, + system_additions: systemAdditions || '', + authors_note_default: authorsNoteDefault || '', + instructions: [], + format_hints: { + wi_format: '[{content}]', + scenario_format: '[Scenario: {content}]', + personality_format: '[{char}\'s personality: {content}]' + } + }; + + await invoke('save_custom_preset', { preset }); + + formDiv.remove(); + setStatus('Custom preset created', 'success'); + setTimeout(() => setStatus('Ready'), 2000); + + // Reload presets + await loadPresets(); + + // Select the new preset + document.getElementById('preset-select').value = id; + await handlePresetSelect(id); + } catch (error) { + console.error('Failed to create preset:', error); + alert(`Failed to create preset: ${error}`); + setStatus('Failed to create preset', 'error'); + setTimeout(() => setStatus('Ready'), 2000); + } + }); } // Render instruction blocks list @@ -3118,30 +3172,74 @@ async function deletePreset() { async function duplicatePreset() { if (!currentEditingPreset) return; - const newName = prompt(`Enter a name for the duplicated preset:`, `${currentEditingPreset.name} (Copy)`); - if (!newName || !newName.trim()) return; + // Check if form already exists + if (document.getElementById('preset-duplicate-form')) return; - try { - const duplicatedPreset = await invoke('duplicate_preset', { - sourcePresetId: currentEditingPreset.id, - newName: newName.trim() - }); + const presetInfo = document.getElementById('preset-info'); + const formDiv = document.createElement('div'); + formDiv.id = 'preset-duplicate-form'; + formDiv.style.background = 'var(--bg-secondary)'; + formDiv.style.border = '2px solid var(--accent)'; + formDiv.style.borderRadius = '8px'; + formDiv.style.padding = '16px'; + formDiv.style.marginBottom = '16px'; - setStatus('Preset duplicated successfully', 'success'); - setTimeout(() => setStatus('Ready'), 2000); + formDiv.innerHTML = ` +
+
Duplicate Preset
+
+ + +
+
+ + +
+
+ `; - // Reload presets - await loadPresets(); + presetInfo.parentNode.insertBefore(formDiv, presetInfo.nextSibling); + document.getElementById('preset-duplicate-name').focus(); + document.getElementById('preset-duplicate-name').select(); - // Select the new preset - document.getElementById('preset-select').value = duplicatedPreset.id; - await handlePresetSelect(duplicatedPreset.id); - } catch (error) { - console.error('Failed to duplicate preset:', error); - alert(`Failed to duplicate preset: ${error}`); - setStatus('Failed to duplicate preset', 'error'); - setTimeout(() => setStatus('Ready'), 2000); - } + // Cancel button + document.getElementById('preset-duplicate-cancel').addEventListener('click', () => { + formDiv.remove(); + }); + + // Duplicate button + document.getElementById('preset-duplicate-save').addEventListener('click', async () => { + const newName = document.getElementById('preset-duplicate-name').value.trim(); + if (!newName) { + alert('Please enter a preset name'); + return; + } + + try { + const duplicatedPreset = await invoke('duplicate_preset', { + sourcePresetId: currentEditingPreset.id, + newName: newName + }); + + setStatus('Preset duplicated successfully', 'success'); + setTimeout(() => setStatus('Ready'), 2000); + + // Remove form + formDiv.remove(); + + // Reload presets + await loadPresets(); + + // Select the new preset + document.getElementById('preset-select').value = duplicatedPreset.id; + await handlePresetSelect(duplicatedPreset.id); + } catch (error) { + console.error('Failed to duplicate preset:', error); + alert(`Failed to duplicate preset: ${error}`); + setStatus('Failed to duplicate preset', 'error'); + setTimeout(() => setStatus('Ready'), 2000); + } + }); } // Restore built-in preset to default