You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

149 lines
5.2 KiB

jQuery( function ($) {
'use strict';
const form = $('.enterwell-prize__form');
const imageInput = $('#image');
const uploadLabel = $('.drop-zone__label');
const dragLabel = $('.drop-zone__label-drag');
const imageContainer = $('.image-container');
const previewContainer = $('.image-container__preview');
const previewImage = $('.preview-image');
const droppedContent = $('.upload-icon, .support-notice');
// Show a preview image of the file
function showPreviewImage(fileOrUrl) {
if (typeof fileOrUrl === 'string') {
previewImage.attr('src', fileOrUrl);
} else {
// Read the file and create a Data URL for the preview image
const reader = new FileReader();
reader.onload = function(event) {
previewImage.attr('src', event.target.result);
};
reader.readAsDataURL(fileOrUrl);
}
}
// Handle the file upload
function handleUpload(file) {
const allowedTypes = ['image/png', 'image/jpg', 'application/pdf'];
const errorMessage = $('<div>').addClass('error-message').text('Nedozvoljen format.');
if (!allowedTypes.includes(file.type)) {
// Display an error message and preview image
imageContainer.addClass('has-error');
if (!imageContainer.hasClass('dropped')) {
droppedContent.hide();
}
showPreviewImage('wp-content/plugins/enterwell-prize/images/image-error-upload.png');
previewContainer.find('figcaption').text('Prijenos nije uspio.');
previewContainer.show();
// Check if error message already exists and remove it
if (imageContainer.parent().find('.error-message').length > 0) {
imageContainer.parent().find('.error-message').remove();
}
imageContainer.parent('.image').append(errorMessage);
} else {
imageContainer.removeClass('has-error empty');
imageInput.removeClass('has-error');
imageInput.attr('value', 'uploaded');
imageContainer.addClass('dropped');
// Remove error message if present
imageContainer.parent('.image').find('.error-message').remove();
dragLabel.hide();
droppedContent.hide();
// Display the uploaded image and file name
showPreviewImage(file);
$('.preview-name').text(file.name);
previewContainer.show();
}
}
// Handle the file select event
function handleFileSelect(event) {
const file = this.files[0];
handleUpload(file);
}
// Handle the file drop event
function handleDrop(event) {
event.preventDefault();
imageContainer.removeClass('drag-over');
form.removeClass('drag');
uploadLabel.show();
dragLabel.hide();
droppedContent.hide();
const file = event.originalEvent.dataTransfer.files[0];
handleUpload(file);
previewContainer.show();
}
// Handle the drag over event
function handleDragOver(event) {
event.preventDefault();
event.stopPropagation();
imageContainer.addClass('drag-over');
form.addClass('drag');
uploadLabel.hide();
droppedContent.show();
if (!imageContainer.hasClass('dropped') || imageContainer.hasClass('has-error')) {
dragLabel.show();
if (!imageContainer.hasClass('has-error')) {
droppedContent.show();
}
}
if (imageContainer.hasClass('has-error')) {
previewContainer.hide();
dragLabel.show();
}
if (imageContainer.hasClass('dropped')) {
previewContainer.hide();
dragLabel.show();
}
}
function handleDragEnter(event) {
event.preventDefault();
imageContainer.addClass('drag-over');
}
// Handle the drag leave event
function handleDragLeave(event) {
if (!imageContainer.hasClass('drag-over')) {
return;
}
// Ignore dragleave events when the mouse is over a child of imageContainer or droppedContent
const relatedTarget = $(event.relatedTarget);
if (relatedTarget.closest('.image-container, .upload-icon, .support-notice').length) {
return;
}
event.preventDefault();
imageContainer.removeClass('drag-over');
if (!imageContainer.hasClass('dropped')) {
uploadLabel.show();
dragLabel.hide();
droppedContent.show();
if (imageContainer.hasClass('has-error')) {
previewContainer.show();
droppedContent.hide();
}
} else {
uploadLabel.show();
previewContainer.show();
dragLabel.hide();
droppedContent.hide();
}
form.removeClass('drag');
}
// Add event listeners
imageInput.on('change', handleFileSelect);
droppedContent.on('dragenter', handleDragEnter);
imageContainer.on('dragover', handleDragOver);
imageContainer.on('dragleave', handleDragLeave);
imageContainer.on('drop', handleDrop);
});