quackscape/assets/js/userarea.js

131 lines
4.3 KiB
JavaScript
Raw Normal View History

import '../scss/frontend.scss';
import '../css/userarea.css';
import { getCookie } from './api';
import { Tab } from 'bootstrap';
import DataTable from 'datatables.net-dt';
let mediaTable = new DataTable('#mediaTable');
let scenesTable = new DataTable('#scenesTable');
let permissionsTable = new DataTable('#permissionsTable');
/* Uploads */
document.querySelectorAll('.drop-zone__input').forEach(inputElement => {
const dropZoneElement = inputElement.closest('.drop-zone');
dropZoneElement.addEventListener('click', e => {
inputElement.click();
});
dropZoneElement.addEventListener('dragover', e => {
e.preventDefault();
dropZoneElement.classList.add('drop-zone--over');
});
['dragleave', 'dragend', 'drop'].forEach(type => {
dropZoneElement.addEventListener(type, e => {
dropZoneElement.classList.remove('drop-zone--over');
});
});
dropZoneElement.addEventListener('drop', e => {
e.preventDefault();
if (e.dataTransfer.files.length) {
inputElement.files = e.dataTransfer.files;
handleFiles(inputElement.files);
}
});
inputElement.addEventListener('change', e => {
if (inputElement.files.length) {
handleFiles(inputElement.files);
}
});
});
function handleFiles(files) {
const uploadStatus = document.getElementById('uploadStatus');
Array.from(files).forEach(file => {
const fileRow = document.createElement('div');
fileRow.classList.add('row', 'align-items-center', 'mb-2', 'file-upload-wrapper');
const thumbnailCol = document.createElement('div');
thumbnailCol.classList.add('col-2');
const thumbnail = document.createElement('img');
thumbnail.classList.add('img-fluid', 'thumbnail');
thumbnail.src = ''; // Placeholder until upload completes
thumbnailCol.appendChild(thumbnail);
const fileNameCol = document.createElement('div');
fileNameCol.classList.add('col-7');
const fileName = document.createElement('span');
fileName.classList.add('file-name');
fileName.textContent = file.name;
fileNameCol.appendChild(fileName);
const progressCol = document.createElement('div');
progressCol.classList.add('col-3');
const progressBar = document.createElement('div');
progressBar.classList.add('progress');
const progressBarInner = document.createElement('div');
progressBarInner.classList.add('progress-bar');
progressBarInner.setAttribute('role', 'progressbar');
progressBarInner.setAttribute('aria-valuemin', '0');
progressBarInner.setAttribute('aria-valuemax', '100');
progressBarInner.style.width = '0%';
progressBar.appendChild(progressBarInner);
progressCol.appendChild(progressBar);
fileRow.appendChild(thumbnailCol);
fileRow.appendChild(fileNameCol);
fileRow.appendChild(progressCol);
uploadStatus.prepend(fileRow);
uploadFile(file, progressBarInner, thumbnail);
});
}
function uploadFile(file, progressBar, thumbnail) {
const xhr = new XMLHttpRequest();
const formData = new FormData();
formData.append('file', file);
formData.append('csrfmiddlewaretoken', getCookie('csrftoken'));
if (file.type.startsWith('image')) {
formData.append('media_type', 'image');
} else if (file.type.startsWith('video')) {
formData.append('media_type', 'video');
} else {
formData.append('media_type', 'other');
}
formData.append('title', file.name);
xhr.upload.addEventListener('progress', (e) => {
if (e.lengthComputable) {
const percentComplete = (e.loaded / e.total) * 100;
progressBar.style.width = `${percentComplete}%`;
progressBar.textContent = `${Math.round(percentComplete)}%`;
}
});
xhr.open('POST', document.location.href, true);
xhr.onload = () => {
if (xhr.status === 200) {
const response = JSON.parse(xhr.responseText);
const thumbnailUrl = response.thumbnailUrl;
thumbnail.src = thumbnailUrl;
} else {
progressBar.classList.add('bg-danger');
progressBar.textContent = "Error!";
}
};
xhr.send(formData);
}