From 2b7fdb4f044d00d8505651c0989c140cc04c6aa9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Dvo=C5=99=C3=A1k?=
<150935816+Dvorinka@users.noreply.github.com>
Date: Tue, 27 May 2025 12:58:01 +0200
Subject: [PATCH] Add files via upload
---
admin-dashboard.html | 279 ++++++++++++++++++++++++++++++-------------
1 file changed, 196 insertions(+), 83 deletions(-)
diff --git a/admin-dashboard.html b/admin-dashboard.html
index c2bc0d3..b909935 100644
--- a/admin-dashboard.html
+++ b/admin-dashboard.html
@@ -195,6 +195,8 @@
min-height: 180px;
transition: var(--transition);
box-shadow: var(--box-shadow);
+ width: 100%;
+ max-width: 100%;
}
.banner-preview:hover {
@@ -232,14 +234,11 @@
position: relative;
z-index: 2;
text-align: center;
- padding: 40px 30px;
+ padding: 20px;
margin: 0;
width: 100%;
box-sizing: border-box;
- display: flex;
- flex-direction: column;
- justify-content: center;
- min-height: 180px;
+ display: block;
}
.banner-preview-bg {
@@ -260,12 +259,9 @@
position: relative;
z-index: 2;
margin: 0;
- padding: 20px;
- font-size: 1.2rem;
- line-height: 1.6;
+ padding: 0;
+ line-height: 1.5;
word-wrap: break-word;
- font-weight: 500;
- text-shadow: 0 1px 2px rgba(0,0,0,0.1);
}
.color-picker-container {
display: flex;
@@ -471,6 +467,59 @@
margin-bottom: 0.5rem;
}
}
+
+ .drag-drop-area {
+ border: 2px dashed var(--border-color);
+ border-radius: var(--border-radius);
+ padding: 30px 20px;
+ text-align: center;
+ background-color: #f8f9fa;
+ cursor: pointer;
+ transition: var(--transition);
+ margin-bottom: 15px;
+ position: relative;
+ }
+
+ .drag-drop-area:hover, .drag-drop-area.dragover {
+ border-color: var(--primary-color);
+ background-color: rgba(74, 108, 247, 0.05);
+ }
+
+ .drag-drop-message {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ color: var(--secondary-color);
+ }
+
+ .drag-drop-message i {
+ font-size: 2.5rem;
+ margin-bottom: 15px;
+ color: var(--primary-color);
+ }
+
+ .drag-drop-message p {
+ margin: 0;
+ font-size: 1rem;
+ }
+
+ .image-actions {
+ display: flex;
+ gap: 10px;
+ }
+
+ .image-preview {
+ max-width: 100%;
+ max-height: 200px;
+ border-radius: 4px;
+ margin-top: 10px;
+ display: none;
+ }
+
+ .banner-preview.with-image {
+ min-height: 220px;
+ }
@@ -500,7 +549,18 @@
-
+
+
+
+
+
Přetáhněte obrázek sem nebo klikněte pro výběr
+
+
+
![]()
+
+
+
+
@@ -508,10 +568,8 @@
Odstranit obrázek
-
-
![]()
-
-
+
+
Doporučený poměr stran: 3:1 (např. 1200x400px)
@@ -577,12 +635,11 @@
-
-
Náhled banneru se zde zobrazí
-
-
![]()
-
-
+
Náhled banneru se zde zobrazí
+
+
+
+
@@ -676,11 +733,62 @@ window.fetch = async function(resource, init = {}) {
return originalFetch(resource, init);
};
-// Image handling
-document.getElementById('uploadImageBtn').addEventListener('click', function() {
- document.getElementById('bannerImage').click();
+// Image handling - Drag and Drop functionality
+const dragDropArea = document.getElementById('dragDropArea');
+const uploadImageBtn = document.getElementById('uploadImageBtn');
+const bannerImage = document.getElementById('bannerImage');
+
+// Click on drag area to select file
+dragDropArea.addEventListener('click', function() {
+ bannerImage.click();
});
+// Click on upload button to select file
+uploadImageBtn.addEventListener('click', function() {
+ bannerImage.click();
+});
+
+// Prevent default behavior for drag events
+['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {
+ dragDropArea.addEventListener(eventName, preventDefaults, false);
+});
+
+function preventDefaults(e) {
+ e.preventDefault();
+ e.stopPropagation();
+}
+
+// Visual feedback when dragging over the area
+['dragenter', 'dragover'].forEach(eventName => {
+ dragDropArea.addEventListener(eventName, highlight, false);
+});
+
+['dragleave', 'drop'].forEach(eventName => {
+ dragDropArea.addEventListener(eventName, unhighlight, false);
+});
+
+function highlight() {
+ dragDropArea.classList.add('dragover');
+}
+
+function unhighlight() {
+ dragDropArea.classList.remove('dragover');
+}
+
+// Handle dropped files
+dragDropArea.addEventListener('drop', handleDrop, false);
+
+function handleDrop(e) {
+ const dt = e.dataTransfer;
+ const files = dt.files;
+
+ if (files.length) {
+ bannerImage.files = files;
+ const event = new Event('change');
+ bannerImage.dispatchEvent(event);
+ }
+}
+
// Handle image upload
function handleImageUpload(event) {
const fileInput = event.target;
@@ -691,7 +799,7 @@ function handleImageUpload(event) {
// Check file type
const validImageTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml'];
if (!validImageTypes.includes(file.type)) {
- alert('Vyberte prosím soubor obrázku (JPG, PNG, GIF, SVG)');
+ showNotification('Vyberte prosím soubor obrázku (JPG, PNG, GIF, SVG)', 'warning');
fileInput.value = ''; // Reset file input
return;
}
@@ -699,7 +807,7 @@ function handleImageUpload(event) {
// Check file size (max 5MB)
const maxSize = 5 * 1024 * 1024; // 5MB
if (file.size > maxSize) {
- alert('Maximální velikost souboru je 5MB');
+ showNotification('Maximální velikost souboru je 5MB', 'warning');
fileInput.value = ''; // Reset file input
return;
}
@@ -710,6 +818,7 @@ function handleImageUpload(event) {
const preview = document.getElementById('imagePreview');
const previewContainer = document.getElementById('imagePreviewContainer');
const removeBtn = document.getElementById('removeImageBtn');
+ const dragDropMessage = document.querySelector('.drag-drop-message');
// Update preview elements if they exist
if (preview) {
@@ -725,6 +834,11 @@ function handleImageUpload(event) {
removeBtn.style.display = 'inline-block';
}
+ // Hide the drag & drop message when showing preview
+ if (dragDropMessage) {
+ dragDropMessage.style.display = 'none';
+ }
+
// Update hidden input
const removeImageInput = document.getElementById('removeImage');
if (removeImageInput) {
@@ -737,7 +851,7 @@ function handleImageUpload(event) {
};
reader.onerror = function() {
- alert('Při načítání obrázku došlo k chybě. Zkuste to prosím znovu.');
+ showNotification('Při načítání obrázku došlo k chybě. Zkuste to prosím znovu.', 'error');
fileInput.value = ''; // Reset file input
};
@@ -1005,6 +1119,7 @@ function removeImage() {
const imagePreviewContainer = document.getElementById('imagePreviewContainer');
const removeBtn = document.getElementById('removeImageBtn');
const removeImageInput = document.getElementById('removeImage');
+ const dragDropMessage = document.querySelector('.drag-drop-message');
// Reset file input
if (bannerImage) bannerImage.value = '';
@@ -1020,6 +1135,11 @@ function removeImage() {
imagePreviewContainer.style.display = 'none';
}
+ // Show drag & drop message again
+ if (dragDropMessage) {
+ dragDropMessage.style.display = 'flex';
+ }
+
// Hide remove button
if (removeBtn) {
removeBtn.style.display = 'none';
@@ -1034,6 +1154,9 @@ function removeImage() {
currentImage = null;
updateBannerPreview();
+ // Show success notification
+ showNotification('Obrázek byl odstraněn', 'info');
+
// Trigger a change event on the file input in case any other code is listening
if (bannerImage) {
const event = new Event('change');
@@ -1044,13 +1167,13 @@ function removeImage() {
// Update banner preview
function updateBannerPreview() {
const bannerPreview = document.getElementById('bannerPreview');
- const bannerPreviewText = bannerPreview?.querySelector('.banner-preview-text');
- const bannerPreviewBg = bannerPreview?.querySelector('.banner-preview-bg');
const bannerPreviewContent = bannerPreview?.querySelector('.banner-preview-content');
+ const bannerPreviewBg = bannerPreview?.querySelector('.banner-preview-bg');
const imagePreview = document.getElementById('imagePreview');
const imagePreviewContainer = document.getElementById('imagePreviewContainer');
+ const bannerLink = document.getElementById('bannerLink')?.value || '';
- if (!bannerPreview || !bannerPreviewText || !bannerPreviewBg || !bannerPreviewContent) {
+ if (!bannerPreview || !bannerPreviewContent || !bannerPreviewBg) {
return; // Elements not found
}
@@ -1064,73 +1187,63 @@ function updateBannerPreview() {
const bannerMargin = parseInt(document.getElementById('bannerMargin')?.value || '20');
const bannerBorderRadius = parseInt(document.getElementById('bannerBorderRadius')?.value || '8');
- // Update banner styles
+ // Update banner container styles to match index.html
bannerPreview.style.display = 'block';
- bannerPreview.style.padding = `${bannerPadding}px`;
- bannerPreview.style.margin = `${bannerMargin}px auto`;
- bannerPreview.style.borderRadius = `${bannerBorderRadius}px`;
- bannerPreview.style.overflow = 'hidden';
- bannerPreview.style.position = 'relative';
- bannerPreview.style.backgroundColor = bannerBgColor;
- bannerPreview.style.textAlign = bannerTextAlign;
+ bannerPreview.style.width = '100%';
+ bannerPreview.style.transition = 'all 0.3s ease';
+ bannerPreview.style.margin = '0 auto';
+ bannerPreview.style.maxWidth = '100%';
+ bannerPreview.style.padding = '0';
- // Update banner content
- bannerPreviewText.textContent = bannerText || 'Náhled banneru';
- bannerPreviewText.style.fontSize = `${bannerFontSize}px`;
- bannerPreviewText.style.color = bannerTextColor;
- bannerPreviewText.style.margin = '0';
- bannerPreviewText.style.padding = '15px';
- bannerPreviewText.style.position = 'relative';
- bannerPreviewText.style.zIndex = '2';
+ // Update banner content styles to match index.html
+ Object.assign(bannerPreviewContent.style, {
+ backgroundColor: bannerBgColor,
+ color: bannerTextColor,
+ textAlign: bannerTextAlign,
+ fontSize: `${bannerFontSize}px`,
+ padding: `${bannerPadding}px`,
+ margin: `${bannerMargin}px 0`,
+ borderRadius: `${bannerBorderRadius}px`,
+ boxShadow: '0 2px 4px rgba(0,0,0,0.1)',
+ display: 'block',
+ position: 'relative',
+ zIndex: '2'
+ });
- // Handle image
+ // Handle content and image like in index.html
+ let content = bannerText || 'Náhled banneru';
const bannerImage = document.getElementById('bannerImage');
const hasImage = currentImage || (bannerImage && bannerImage.files.length > 0);
- if (hasImage) {
- bannerPreview.classList.add('with-image');
+ if (hasImage && currentImage) {
+ // Format content with image like in index.html
+ content = `
+
+

+
+ ${content}
+ `;
- // Update background image
- if (currentImage) {
- bannerPreviewBg.style.backgroundImage = `url(${currentImage})`;
- bannerPreviewBg.style.display = 'block';
-
- // Show the image preview in the container
- if (imagePreview && imagePreviewContainer) {
- imagePreview.src = currentImage;
- imagePreviewContainer.style.display = 'block';
- }
- } else {
- bannerPreviewBg.style.backgroundImage = '';
- bannerPreviewBg.style.display = 'none';
-
- // Hide the image preview container if no image
- if (imagePreviewContainer) {
- imagePreviewContainer.style.display = 'none';
- }
+ // Show the image preview in the container
+ if (imagePreview && imagePreviewContainer) {
+ imagePreview.src = currentImage;
+ imagePreviewContainer.style.display = 'block';
}
-
- // Style the background image
- bannerPreviewBg.style.position = 'absolute';
- bannerPreviewBg.style.top = '0';
- bannerPreviewBg.style.left = '0';
- bannerPreviewBg.style.width = '100%';
- bannerPreviewBg.style.height = '100%';
- bannerPreviewBg.style.backgroundSize = 'cover';
- bannerPreviewBg.style.backgroundPosition = 'center';
- bannerPreviewBg.style.backgroundRepeat = 'no-repeat';
- bannerPreviewBg.style.opacity = '0.7';
- bannerPreviewBg.style.zIndex = '1';
} else {
- bannerPreview.classList.remove('with-image');
- bannerPreviewBg.style.display = 'none';
-
- // Hide the image preview container
+ // Hide the image preview container if no image
if (imagePreviewContainer) {
imagePreviewContainer.style.display = 'none';
}
}
+ // Wrap in link if provided
+ if (bannerLink) {
+ content = `
${content}`;
+ }
+
+ // Update content
+ bannerPreviewContent.innerHTML = content;
+
// Make sure the preview is visible
bannerPreview.style.visibility = 'visible';
}