|
import './components/slider.js';
|
|
import './components/navigation.js'; // Assuming navigation.js might be needed globally
|
|
import { showUploadModal } from './components/upload.js'; // Import showUploadModal
|
|
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
// Logic for custom-slider on order page
|
|
const slider = document.querySelector('custom-slider');
|
|
const priceDisplay = document.getElementById('total_price');
|
|
|
|
if (slider && priceDisplay) {
|
|
const pricePerGb = parseFloat(slider.dataset.pricePerGb);
|
|
|
|
const updatePrice = () => {
|
|
const value = parseFloat(slider.value);
|
|
const totalPrice = (value * pricePerGb).toFixed(2);
|
|
priceDisplay.textContent = `$${totalPrice}`;
|
|
};
|
|
|
|
updatePrice();
|
|
slider.addEventListener('input', updatePrice);
|
|
}
|
|
|
|
// Logic for pricing page toggle
|
|
const pricingToggle = document.querySelector('.pricing-toggle');
|
|
if (pricingToggle) {
|
|
const monthlyBtn = pricingToggle.querySelector('[data-period="monthly"]');
|
|
const annuallyBtn = pricingToggle.querySelector('[data-period="annually"]');
|
|
const pricingCards = document.querySelectorAll('.pricing-card');
|
|
|
|
const monthlyPrices = {
|
|
"Free": 0,
|
|
"Personal": 9,
|
|
"Professional": 29,
|
|
"Business": 99
|
|
};
|
|
|
|
const annualPrices = {
|
|
"Free": 0,
|
|
"Personal": 90, // 9 * 10 (assuming 2 months free)
|
|
"Professional": 290, // 29 * 10
|
|
"Business": 990 // 99 * 10
|
|
};
|
|
|
|
function updatePricingDisplay(period) {
|
|
pricingCards.forEach(card => {
|
|
const planName = card.querySelector('h3').textContent;
|
|
const priceElement = card.querySelector('.price');
|
|
let price = 0;
|
|
let periodText = '';
|
|
|
|
if (period === 'monthly') {
|
|
price = monthlyPrices[planName];
|
|
periodText = '/month';
|
|
} else {
|
|
price = annualPrices[planName];
|
|
periodText = '/year';
|
|
}
|
|
|
|
if (planName === "Free") {
|
|
priceElement.innerHTML = `$${price}<span>${periodText}</span>`;
|
|
} else if (planName === "Business") {
|
|
// Business plan might have custom pricing, keep it as is or adjust
|
|
priceElement.innerHTML = `$${price}<span>${periodText}</span>`;
|
|
}
|
|
else {
|
|
priceElement.innerHTML = `$${price}<span>${periodText}</span>`;
|
|
}
|
|
});
|
|
}
|
|
|
|
monthlyBtn.addEventListener('click', () => {
|
|
monthlyBtn.classList.add('active');
|
|
annuallyBtn.classList.remove('active');
|
|
updatePricingDisplay('monthly');
|
|
});
|
|
|
|
annuallyBtn.addEventListener('click', () => {
|
|
annuallyBtn.classList.add('active');
|
|
monthlyBtn.classList.remove('active');
|
|
updatePricingDisplay('annually');
|
|
});
|
|
|
|
// Initial display based on active button (default to monthly)
|
|
updatePricingDisplay('monthly');
|
|
}
|
|
|
|
// --- File Browser Specific Logic ---
|
|
|
|
// Helper functions for modals
|
|
function showNewFolderModal() {
|
|
document.getElementById('new-folder-modal').style.display = 'block';
|
|
}
|
|
|
|
function closeModal(modalId) {
|
|
document.getElementById(modalId).style.display = 'none';
|
|
}
|
|
window.closeModal = closeModal; // Make it globally accessible
|
|
|
|
window.onclick = function(event) {
|
|
if (event.target.classList.contains('modal')) {
|
|
event.target.style.display = 'none';
|
|
}
|
|
}
|
|
|
|
// File actions
|
|
function downloadFile(path) {
|
|
window.location.href = `/files/download/${path}`;
|
|
}
|
|
|
|
async function shareFile(paths, names) {
|
|
const modal = document.getElementById('share-modal');
|
|
const linkContainer = document.getElementById('share-link-container');
|
|
const loading = document.getElementById('share-loading');
|
|
const shareLinkInput = document.getElementById('share-link-input');
|
|
const shareFileName = document.getElementById('share-file-name');
|
|
const shareLinksList = document.getElementById('share-links-list'); // New element for multiple links
|
|
|
|
// Clear previous content
|
|
shareLinkInput.value = '';
|
|
if (shareLinksList) shareLinksList.innerHTML = '';
|
|
linkContainer.style.display = 'none';
|
|
loading.style.display = 'block';
|
|
modal.style.display = 'block';
|
|
|
|
if (paths.length === 1) {
|
|
shareFileName.textContent = `Sharing: ${names[0]}`;
|
|
} else {
|
|
shareFileName.textContent = `Sharing ${paths.length} items`;
|
|
}
|
|
|
|
try {
|
|
const response = await fetch(`/files/share_multiple`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json'
|
|
},
|
|
body: JSON.stringify({ paths: paths })
|
|
});
|
|
const data = await response.json();
|
|
|
|
if (data.share_links && data.share_links.length > 0) {
|
|
if (data.share_links.length === 1) {
|
|
shareLinkInput.value = data.share_links[0];
|
|
linkContainer.style.display = 'block';
|
|
} else {
|
|
// Display multiple links
|
|
if (!shareLinksList) {
|
|
// Create the list if it doesn't exist
|
|
const ul = document.createElement('ul');
|
|
ul.id = 'share-links-list';
|
|
linkContainer.appendChild(ul);
|
|
shareLinksList = ul;
|
|
}
|
|
data.share_links.forEach(item => {
|
|
const li = document.createElement('li');
|
|
li.innerHTML = `<strong>${item.name}:</strong> <input type="text" value="${item.link}" readonly class="form-input share-link-item-input"> <button class="btn-primary copy-share-link-item-btn" data-link="${item.link}">Copy</button>`;
|
|
shareLinksList.appendChild(li);
|
|
});
|
|
linkContainer.style.display = 'block';
|
|
}
|
|
loading.style.display = 'none';
|
|
} else {
|
|
loading.textContent = 'Error generating share link(s)';
|
|
}
|
|
} catch (error) {
|
|
console.error('Error sharing files:', error);
|
|
loading.textContent = 'Error generating share link(s)';
|
|
}
|
|
}
|
|
|
|
function copyShareLink() {
|
|
const input = document.getElementById('share-link-input');
|
|
input.select();
|
|
document.execCommand('copy');
|
|
alert('Share link copied to clipboard');
|
|
}
|
|
|
|
function deleteFile(paths, names) {
|
|
const deleteForm = document.getElementById('delete-form');
|
|
const deleteMessage = document.getElementById('delete-message');
|
|
const deleteModal = document.getElementById('delete-modal');
|
|
|
|
// Clear previous hidden inputs
|
|
deleteForm.querySelectorAll('input[name="paths[]"]').forEach(input => input.remove());
|
|
|
|
if (Array.isArray(paths) && paths.length > 1) {
|
|
deleteMessage.textContent = `Are you sure you want to delete ${paths.length} items? This action cannot be undone.`;
|
|
deleteForm.action = `/files/delete_multiple`;
|
|
paths.forEach(path => {
|
|
const input = document.createElement('input');
|
|
input.type = 'hidden';
|
|
input.name = 'paths[]';
|
|
input.value = path;
|
|
deleteForm.appendChild(input);
|
|
});
|
|
} else {
|
|
const path = Array.isArray(paths) ? paths[0] : paths;
|
|
const name = Array.isArray(names) ? names[0] : names;
|
|
deleteMessage.textContent = `Are you sure you want to delete "${name}"? This action cannot be undone.`;
|
|
deleteForm.action = `/files/delete/${path}`;
|
|
}
|
|
deleteModal.style.display = 'block';
|
|
}
|
|
|
|
// Selection and action buttons
|
|
function updateActionButtons() {
|
|
const checked = document.querySelectorAll('.file-checkbox:checked');
|
|
const downloadBtn = document.getElementById('download-selected-btn');
|
|
const shareBtn = document.getElementById('share-selected-btn');
|
|
const deleteBtn = document.getElementById('delete-selected-btn');
|
|
|
|
const hasSelection = checked.length > 0;
|
|
const hasFiles = Array.from(checked).some(cb => cb.dataset.isDir === 'False');
|
|
|
|
if (downloadBtn) downloadBtn.disabled = !hasFiles;
|
|
if (shareBtn) shareBtn.disabled = !hasSelection;
|
|
if (deleteBtn) deleteBtn.disabled = !hasSelection;
|
|
}
|
|
|
|
function downloadSelected() {
|
|
const checked = document.querySelectorAll('.file-checkbox:checked');
|
|
if (checked.length === 1 && checked[0].dataset.isDir === 'False') {
|
|
downloadFile(checked[0].dataset.path);
|
|
}
|
|
}
|
|
|
|
function shareSelected() {
|
|
const checked = document.querySelectorAll('.file-checkbox:checked');
|
|
if (checked.length > 0) {
|
|
const paths = Array.from(checked).map(cb => cb.dataset.path);
|
|
const names = Array.from(checked).map(cb =>
|
|
cb.closest('tr').querySelector('td:nth-child(2)').textContent.trim()
|
|
);
|
|
shareFile(paths, names);
|
|
}
|
|
}
|
|
|
|
function deleteSelected() {
|
|
const checked = document.querySelectorAll('.file-checkbox:checked');
|
|
if (checked.length > 0) {
|
|
const paths = Array.from(checked).map(cb => cb.dataset.path);
|
|
const names = Array.from(checked).map(cb =>
|
|
cb.closest('tr').querySelector('td:nth-child(2)').textContent.trim()
|
|
);
|
|
deleteFile(paths, names);
|
|
}
|
|
}
|
|
|
|
// Event Listeners for File Browser
|
|
const newFolderBtn = document.getElementById('new-folder-btn');
|
|
if (newFolderBtn) {
|
|
console.log('Attaching event listener to new-folder-btn');
|
|
newFolderBtn.addEventListener('click', showNewFolderModal);
|
|
}
|
|
|
|
const uploadBtn = document.getElementById('upload-btn');
|
|
if (uploadBtn) {
|
|
console.log('Attaching event listener to upload-btn');
|
|
uploadBtn.addEventListener('click', showUploadModal);
|
|
}
|
|
|
|
const createFirstFolderBtn = document.getElementById('create-first-folder-btn');
|
|
if (createFirstFolderBtn) {
|
|
console.log('Attaching event listener to create-first-folder-btn');
|
|
createFirstFolderBtn.addEventListener('click', showNewFolderModal);
|
|
}
|
|
|
|
const uploadFirstFileBtn = document.getElementById('upload-first-file-btn');
|
|
if (uploadFirstFileBtn) {
|
|
console.log('Attaching event listener to upload-first-file-btn');
|
|
uploadFirstFileBtn.addEventListener('click', showUploadModal);
|
|
}
|
|
|
|
const downloadSelectedBtn = document.getElementById('download-selected-btn');
|
|
if (downloadSelectedBtn) {
|
|
downloadSelectedBtn.addEventListener('click', downloadSelected);
|
|
}
|
|
|
|
const shareSelectedBtn = document.getElementById('share-selected-btn');
|
|
if (shareSelectedBtn) {
|
|
shareSelectedBtn.addEventListener('click', shareSelected);
|
|
}
|
|
|
|
const deleteSelectedBtn = document.getElementById('delete-selected-btn');
|
|
if (deleteSelectedBtn) {
|
|
deleteSelectedBtn.addEventListener('click', deleteSelected);
|
|
}
|
|
|
|
const copyShareLinkBtn = document.getElementById('copy-share-link-btn');
|
|
if (copyShareLinkBtn) {
|
|
copyShareLinkBtn.addEventListener('click', copyShareLink);
|
|
}
|
|
|
|
document.getElementById('select-all')?.addEventListener('change', function(e) {
|
|
const checkboxes = document.querySelectorAll('.file-checkbox');
|
|
checkboxes.forEach(cb => cb.checked = e.target.checked);
|
|
updateActionButtons();
|
|
});
|
|
|
|
document.querySelectorAll('.file-checkbox').forEach(cb => {
|
|
cb.addEventListener('change', updateActionButtons);
|
|
});
|
|
|
|
// Event listeners for dynamically created download/share/delete buttons
|
|
document.addEventListener('click', (event) => {
|
|
if (event.target.classList.contains('download-file-btn')) {
|
|
downloadFile(event.target.dataset.path);
|
|
} else if (event.target.classList.contains('share-file-btn')) {
|
|
const path = event.target.dataset.path;
|
|
const name = event.target.dataset.name;
|
|
shareFile([path], [name]);
|
|
} else if (event.target.classList.contains('delete-file-btn')) {
|
|
const path = event.target.dataset.path;
|
|
const name = event.target.dataset.name;
|
|
deleteFile([path], [name]);
|
|
} else if (event.target.classList.contains('copy-share-link-item-btn')) {
|
|
const linkToCopy = event.target.dataset.link;
|
|
navigator.clipboard.writeText(linkToCopy).then(() => {
|
|
alert('Share link copied to clipboard');
|
|
}).catch(err => {
|
|
console.error('Failed to copy link: ', err);
|
|
alert('Failed to copy link');
|
|
});
|
|
}
|
|
});
|
|
|
|
|
|
document.getElementById('search-bar')?.addEventListener('input', function(e) {
|
|
const searchTerm = e.target.value.toLowerCase();
|
|
const rows = document.querySelectorAll('#file-list-body tr');
|
|
|
|
rows.forEach(row => {
|
|
const name = row.querySelector('td:nth-child(2)')?.textContent.toLowerCase();
|
|
if (name && name.includes(searchTerm)) {
|
|
row.style.display = '';
|
|
} else {
|
|
row.style.display = 'none';
|
|
}
|
|
});
|
|
});
|
|
|
|
// Initial update of action buttons
|
|
updateActionButtons();
|
|
});
|