333 lines
11 KiB
JavaScript
333 lines
11 KiB
JavaScript
/**
|
|
* Crypto Settings Module
|
|
* Handles the encryption settings modal and mode switching
|
|
*/
|
|
|
|
class CryptoSettings {
|
|
constructor() {
|
|
this.currentMode = 'single';
|
|
this.settings = {
|
|
processingMode: 'single',
|
|
enableFilePreview: true,
|
|
autoDownloadResults: true,
|
|
sequentialProcessing: true,
|
|
showDetailedProgress: true,
|
|
stopOnError: false,
|
|
maxFileSizeMB: 100
|
|
};
|
|
this.setupEventListeners();
|
|
this.loadSettings();
|
|
}
|
|
|
|
setupEventListeners() {
|
|
// Modal controls
|
|
const settingsBtn = document.getElementById("crypto-settings-btn");
|
|
const modal = document.getElementById("crypto-settings-modal");
|
|
const closeBtn = document.getElementById("close-crypto-settings");
|
|
const applyBtn = document.getElementById("apply-crypto-settings");
|
|
const resetBtn = document.getElementById("reset-crypto-settings");
|
|
|
|
if (settingsBtn && modal) {
|
|
settingsBtn.addEventListener("click", () => {
|
|
modal.style.display = "flex";
|
|
this.updateModalFromSettings();
|
|
});
|
|
}
|
|
|
|
if (closeBtn && modal) {
|
|
closeBtn.addEventListener("click", () => {
|
|
modal.style.display = "none";
|
|
});
|
|
}
|
|
|
|
// Close modal when clicking outside
|
|
if (modal) {
|
|
modal.addEventListener("click", (e) => {
|
|
if (e.target === modal) {
|
|
modal.style.display = "none";
|
|
}
|
|
});
|
|
}
|
|
|
|
if (applyBtn && modal) {
|
|
applyBtn.addEventListener("click", () => {
|
|
this.applySettings();
|
|
modal.style.display = "none";
|
|
});
|
|
}
|
|
|
|
if (resetBtn) {
|
|
resetBtn.addEventListener("click", () => {
|
|
this.resetToDefaults();
|
|
});
|
|
}
|
|
|
|
// Processing mode radio buttons
|
|
const singleModeRadio = document.getElementById("single-file-mode-radio");
|
|
const bulkModeRadio = document.getElementById("bulk-file-mode-radio");
|
|
|
|
if (singleModeRadio) {
|
|
singleModeRadio.addEventListener("change", () => {
|
|
if (singleModeRadio.checked) {
|
|
this.toggleBulkOptions(false);
|
|
}
|
|
});
|
|
}
|
|
|
|
if (bulkModeRadio) {
|
|
bulkModeRadio.addEventListener("change", () => {
|
|
if (bulkModeRadio.checked) {
|
|
this.toggleBulkOptions(true);
|
|
}
|
|
});
|
|
}
|
|
|
|
// File size input validation
|
|
const fileSizeInput = document.getElementById("max-file-size-input");
|
|
if (fileSizeInput) {
|
|
fileSizeInput.addEventListener("input", () => {
|
|
let value = parseInt(fileSizeInput.value);
|
|
if (value < 1) {
|
|
fileSizeInput.value = 1;
|
|
} else if (value > 1000) {
|
|
fileSizeInput.value = 1000;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
toggleBulkOptions(show) {
|
|
const bulkOptions = document.getElementById("bulk-options");
|
|
if (bulkOptions) {
|
|
bulkOptions.style.display = show ? "block" : "none";
|
|
}
|
|
}
|
|
|
|
updateModalFromSettings() {
|
|
// Set radio buttons
|
|
const singleModeRadio = document.getElementById("single-file-mode-radio");
|
|
const bulkModeRadio = document.getElementById("bulk-file-mode-radio");
|
|
|
|
if (this.settings.processingMode === 'single') {
|
|
if (singleModeRadio) singleModeRadio.checked = true;
|
|
this.toggleBulkOptions(false);
|
|
} else {
|
|
if (bulkModeRadio) bulkModeRadio.checked = true;
|
|
this.toggleBulkOptions(true);
|
|
}
|
|
|
|
// Set checkboxes
|
|
const checkboxes = [
|
|
{ id: "enable-file-preview", setting: "enableFilePreview" },
|
|
{ id: "auto-download-results", setting: "autoDownloadResults" },
|
|
{ id: "sequential-processing", setting: "sequentialProcessing" },
|
|
{ id: "show-detailed-progress", setting: "showDetailedProgress" },
|
|
{ id: "stop-on-error", setting: "stopOnError" }
|
|
];
|
|
|
|
checkboxes.forEach(checkbox => {
|
|
const element = document.getElementById(checkbox.id);
|
|
if (element) {
|
|
element.checked = this.settings[checkbox.setting];
|
|
}
|
|
});
|
|
|
|
// Set file size
|
|
const fileSizeInput = document.getElementById("max-file-size-input");
|
|
if (fileSizeInput) {
|
|
fileSizeInput.value = this.settings.maxFileSizeMB;
|
|
}
|
|
}
|
|
|
|
applySettings() {
|
|
// Get processing mode
|
|
const singleModeRadio = document.getElementById("single-file-mode-radio");
|
|
const bulkModeRadio = document.getElementById("bulk-file-mode-radio");
|
|
|
|
if (singleModeRadio && singleModeRadio.checked) {
|
|
this.settings.processingMode = 'single';
|
|
} else if (bulkModeRadio && bulkModeRadio.checked) {
|
|
this.settings.processingMode = 'bulk';
|
|
}
|
|
|
|
// Get checkbox values
|
|
const checkboxes = [
|
|
{ id: "enable-file-preview", setting: "enableFilePreview" },
|
|
{ id: "auto-download-results", setting: "autoDownloadResults" },
|
|
{ id: "sequential-processing", setting: "sequentialProcessing" },
|
|
{ id: "show-detailed-progress", setting: "showDetailedProgress" },
|
|
{ id: "stop-on-error", setting: "stopOnError" }
|
|
];
|
|
|
|
checkboxes.forEach(checkbox => {
|
|
const element = document.getElementById(checkbox.id);
|
|
if (element) {
|
|
this.settings[checkbox.setting] = element.checked;
|
|
}
|
|
});
|
|
|
|
// Get file size
|
|
const fileSizeInput = document.getElementById("max-file-size-input");
|
|
if (fileSizeInput) {
|
|
this.settings.maxFileSizeMB = parseInt(fileSizeInput.value) || 100;
|
|
}
|
|
|
|
// Apply the mode change
|
|
this.switchMode(this.settings.processingMode);
|
|
|
|
// Save settings
|
|
this.saveSettings();
|
|
|
|
// Show feedback
|
|
this.showFeedback("Settings applied successfully!");
|
|
}
|
|
|
|
switchMode(mode) {
|
|
this.currentMode = mode;
|
|
|
|
const singleFileMode = document.getElementById("single-file-mode");
|
|
const bulkFileMode = document.getElementById("bulk-file-mode");
|
|
|
|
if (mode === 'single') {
|
|
if (singleFileMode) singleFileMode.style.display = "block";
|
|
if (bulkFileMode) bulkFileMode.style.display = "none";
|
|
} else {
|
|
if (singleFileMode) singleFileMode.style.display = "none";
|
|
if (bulkFileMode) bulkFileMode.style.display = "block";
|
|
}
|
|
|
|
// Update the form submit handler
|
|
this.updateFormHandler();
|
|
}
|
|
|
|
updateFormHandler() {
|
|
const cryptoForm = document.getElementById("crypto-form");
|
|
if (!cryptoForm) return;
|
|
|
|
// Remove existing event listeners by cloning the form
|
|
const newForm = cryptoForm.cloneNode(true);
|
|
cryptoForm.parentNode.replaceChild(newForm, cryptoForm);
|
|
|
|
// Add the appropriate event listener
|
|
if (this.currentMode === 'single') {
|
|
newForm.addEventListener("submit", this.handleSingleFileSubmit.bind(this));
|
|
} else {
|
|
newForm.addEventListener("submit", this.handleBulkFileSubmit.bind(this));
|
|
}
|
|
}
|
|
|
|
async handleSingleFileSubmit(event) {
|
|
event.preventDefault();
|
|
|
|
const algorithm = document.getElementById("algorithm")?.value;
|
|
const password = document.getElementById("password")?.value;
|
|
const fileInput = document.getElementById("file-input");
|
|
const isDecrypt = document.getElementById("operation-toggle").checked;
|
|
|
|
if (!algorithm || !fileInput) return;
|
|
|
|
// Use existing single file handling logic
|
|
if (window.handleSubmit) {
|
|
window.handleSubmit(event);
|
|
}
|
|
}
|
|
|
|
async handleBulkFileSubmit(event) {
|
|
event.preventDefault();
|
|
|
|
// Use bulk operations functionality
|
|
if (window.bulkOps && window.bulkOps.processFiles) {
|
|
await window.bulkOps.processFiles();
|
|
}
|
|
}
|
|
|
|
resetToDefaults() {
|
|
this.settings = {
|
|
processingMode: 'single',
|
|
enableFilePreview: true,
|
|
autoDownloadResults: true,
|
|
sequentialProcessing: true,
|
|
showDetailedProgress: true,
|
|
stopOnError: false,
|
|
maxFileSizeMB: 100
|
|
};
|
|
|
|
this.updateModalFromSettings();
|
|
this.showFeedback("Settings reset to defaults!");
|
|
}
|
|
|
|
loadSettings() {
|
|
try {
|
|
const saved = localStorage.getItem('paccrypt-crypto-settings');
|
|
if (saved) {
|
|
this.settings = { ...this.settings, ...JSON.parse(saved) };
|
|
}
|
|
} catch (error) {
|
|
console.warn('Failed to load crypto settings:', error);
|
|
}
|
|
|
|
// Apply the loaded settings
|
|
this.switchMode(this.settings.processingMode);
|
|
}
|
|
|
|
saveSettings() {
|
|
try {
|
|
localStorage.setItem('paccrypt-crypto-settings', JSON.stringify(this.settings));
|
|
} catch (error) {
|
|
console.warn('Failed to save crypto settings:', error);
|
|
}
|
|
}
|
|
|
|
showFeedback(message) {
|
|
// Use the existing feedback system or create a temporary one
|
|
const feedbackDiv = document.createElement('div');
|
|
feedbackDiv.className = 'copy-feedback';
|
|
feedbackDiv.textContent = message;
|
|
feedbackDiv.style.cssText = `
|
|
position: fixed;
|
|
top: 20px;
|
|
right: 20px;
|
|
background-color: #00ff99;
|
|
color: #000;
|
|
padding: 10px 20px;
|
|
border-radius: 5px;
|
|
font-weight: bold;
|
|
z-index: 10000;
|
|
display: block;
|
|
`;
|
|
|
|
document.body.appendChild(feedbackDiv);
|
|
|
|
setTimeout(() => {
|
|
feedbackDiv.style.opacity = '0';
|
|
feedbackDiv.style.transition = 'opacity 0.3s ease';
|
|
setTimeout(() => {
|
|
if (feedbackDiv.parentNode) {
|
|
feedbackDiv.parentNode.removeChild(feedbackDiv);
|
|
}
|
|
}, 300);
|
|
}, 2000);
|
|
}
|
|
|
|
// Public methods for external access
|
|
getCurrentMode() {
|
|
return this.currentMode;
|
|
}
|
|
|
|
getSettings() {
|
|
return { ...this.settings };
|
|
}
|
|
|
|
isBulkMode() {
|
|
return this.currentMode === 'bulk';
|
|
}
|
|
}
|
|
|
|
// Initialize crypto settings when DOM is loaded
|
|
let cryptoSettings;
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
cryptoSettings = new CryptoSettings();
|
|
});
|
|
|
|
// Make cryptoSettings available globally
|
|
window.cryptoSettings = cryptoSettings; |