diff --git a/api/Admin.go b/api/Admin.go deleted file mode 100644 index 778f64e..0000000 --- a/api/Admin.go +++ /dev/null @@ -1 +0,0 @@ -package api diff --git a/api/FileHandlers.go b/api/FileHandlers.go index 5bbd46c..0bb414f 100644 --- a/api/FileHandlers.go +++ b/api/FileHandlers.go @@ -31,25 +31,25 @@ func FileHandler(w http.ResponseWriter, r *http.Request) { files, _ := os.ReadDir(filepath.Join(staticDir, "images")) for _, file := range files { fileName := file.Name() - data.ImageNames = append(data.ImageNames, filepath.Join(staticDir, "images", fileName)) + data.ImageNames = append(data.ImageNames, filepath.Join("/", staticDir, "images", fileName)) } files, _ = os.ReadDir(filepath.Join("uploads")) for _, file := range files { fileName := file.Name() - data.ImageNames = append(data.ImageNames, filepath.Join("uploads", fileName)) + data.ImageNames = append(data.ImageNames, filepath.Join("/uploads", fileName)) } files, _ = os.ReadDir(filepath.Join(staticDir, "spicy")) for _, file := range files { fileName := file.Name() - data.SpicyImageNames = append(data.SpicyImageNames, filepath.Join(staticDir, "spicy", fileName)) + data.ImageNames = append(data.ImageNames, filepath.Join("/", staticDir, "spicy", fileName)) } files, _ = os.ReadDir(filepath.Join(staticDir, "ascii_art")) for _, file := range files { fileName := file.Name() data.AsciiFiles = append(data.AsciiFiles, - AsciiEntry{Name: filepath.Join(staticDir, "ascii_art", fileName), FontSize: 12}, + AsciiEntry{Name: filepath.Join("/", staticDir, "ascii_art", fileName), FontSize: 12}, ) } diff --git a/static/css/admin.css b/static/css/admin.css index edf1fb7..d087594 100644 --- a/static/css/admin.css +++ b/static/css/admin.css @@ -4,27 +4,18 @@ body { height: 100vh; background: #101010; color: #fff; - display: flex; - align-items: center; - justify-content: center; } .container { background: #212121; padding: 24px 32px; border-radius: 8px; - max-width: 400px; box-shadow: 0 2px 8px rgba(0,0,0,0.08); } -.active { - background-color: #007bff; - color: white; -} main { display: flex; flex-direction: column; align-items: center; justify-content: center; - max-width: 400px; background: #121212; } nav { @@ -64,4 +55,37 @@ button:hover { display: none; border: 1px solid #ddd; border-radius: 4px; -} \ No newline at end of file +} +.tab-container { + display: none; + padding: 20px; + width: 100%; +} +.tab-container.active { + display: block; +} +.tab-button { + background: #333; + color: #fff; + border: none; + padding: 10px 18px; + border-radius: 4px; + cursor: pointer; + font-size: 1rem; + margin-right: 8px; +} +.tab-button:hover { + background: #555; +} +.tab-button.active { + background: #007bff; +} +.gallery-image { + max-width: 90px; + max-height: 70px; + margin: 10px; + border: 2px solid #444; + border-radius: 4px; + cursor: pointer; + transition: border-color 0.3s; +} diff --git a/static/js/admin.js b/static/js/admin.js index 47c5f0e..c83cf00 100644 --- a/static/js/admin.js +++ b/static/js/admin.js @@ -1,71 +1,11 @@ -const imageInput = document.getElementById('imageInput'); -const preview = document.getElementById('preview'); - -let currentFile = null; +let tab_buttons = $( ".tab-button" ) +let tab_containers = $( ".tab-container" ) - - -imageInput.addEventListener('change', function() { - currentFile = this.files[0]; - if (currentFile) { - const reader = new FileReader(); - reader.onload = function(e) { - preview.src = e.target.result; - preview.style.display = 'block'; - } - reader.readAsDataURL(currentFile); - } else { - preview.style.display = 'none'; - } -}); - -document.getElementById('imageForm').addEventListener('submit', function(e) { - e.preventDefault(); - - // Add your upload logic here - const formData = new FormData(); - formData.append('image', currentFile); - if (!currentFile) { - alert('Please select an image to upload.'); - return; - } - fetch('/upload', { - method: 'POST', - body: formData - }).then(response => response.text()) - .then(data => { - console.log(data); - alert('Image uploaded successfully!'); - window.location.reload(); - }) - .catch(error => { - console.error('Error:', error); - alert('Error uploading image.'); - }); -}); - -function openTab(evt, tabNumber) { - // Declare all variables - var i, tabcontent, tablinks; - - // Get all elements with class="tabcontent" and hide them - tabcontent = document.getElementsByClassName("tab-container"); - for (i = 0; i < tabcontent.length; i++) { - tabcontent[i].style.display = "none"; - } - - // Get all elements with class="tablinks" and remove the class "active" - tablinks = document.getElementsByClassName("tab-button"); - for (i = 0; i < tablinks.length; i++) { - tablinks[i].className = tablinks[i].className.replace(" active", ""); - } - - // Show the current tab, and add an "active" class to the button that opened the tab - console.log("tab-"+tabNumber); - let currentTab = document.getElementById('tab-'+(tabNumber)) - if (currentTab) { - currentTab.style.display = "block"; - } else throw new Error("Tab not found: " + tabNumber); - currentTab.style.display = "block"; - evt.currentTarget.className += " active"; -} +tab_buttons.on( "click", function() { + let id = $( this ).attr( "id" ) + tab_buttons.removeClass( "active" ) + tab_containers.removeClass( "active" ) + $( this ).addClass( "active" ) + console.log( id ) + $( "#tab-" + id ).addClass( "active" ) +}) diff --git a/static/js/image_upload.js b/static/js/image_upload.js new file mode 100644 index 0000000..0171377 --- /dev/null +++ b/static/js/image_upload.js @@ -0,0 +1,49 @@ +let imageInput = $("#imageInput") +let imagePreview = $("#preview") + +let uploadForm = $("#imageForm") + +let currentFile = null; + +imageInput.on("change", function() { + currentFile = this.files[0]; + if (currentFile) { + const reader = new FileReader(); + reader.onload = function(e) { + preview.src = e.target.result; + preview.style.display = 'block'; + } + reader.readAsDataURL(currentFile); + } else { + preview.style.display = 'none'; + } +}) + +uploadForm.on("submit", function(e) { + e.preventDefault(); + + if (!currentFile) { + alert("Please select a file first."); + return; + } + console.log(currentFile); + + let formData = new FormData(this); + formData.append("image", currentFile); + + $.ajax({ + url: "/upload", + type: "POST", + data: formData, + processData: false, + contentType: false, + success: function(response) { + alert("Image uploaded successfully!"); + preview.style.display = 'none'; + currentFile = null; + }, + error: function(xhr, status, error) { + alert("Error uploading image: " + xhr.responseText); + } + }); +}) \ No newline at end of file diff --git a/static/js/images.js b/static/js/images.js new file mode 100644 index 0000000..ebf7fbd --- /dev/null +++ b/static/js/images.js @@ -0,0 +1,58 @@ +let galleryTable = $("#imagesGallery") +let refreshButton = $("#refresh-gallery") + +let filesList = [] + +let fileMetaData = [] + +async function fetchImages() { + await $.ajax({ + url: '/files', + type: 'GET', + success: function(response) { + filesList = response; + console.log(filesList); + }, + error: function() { + alert('Error fetching images.'); + } + }); + + filesList.ImageNames.forEach((filePath, i) => { + let newRow = $(` + + `+ i +` + + + + + 0 + + + + `); + galleryTable.append(newRow); + + fileMetaData.push({ + "id": i, + "spice_level": 0, + "path": filePath + }); + }); + fileMetaData.forEach(file => { + $("#spice-slider-" + file.id).on("input", function() { + file.spice_level = this.value; + $("#spice-output-" + file.id).text(this.value); + console.log(fileMetaData); + }) + }); +} + +refreshButton.on("click", function() { + galleryTable.empty(); + fetchImages(); +}); + +$( document ).ready(function() { + fetchImages(); +}); \ No newline at end of file diff --git a/website/Admin.go b/website/Admin.go new file mode 100644 index 0000000..d78da5d --- /dev/null +++ b/website/Admin.go @@ -0,0 +1 @@ +package admin diff --git a/website/templates/admin.html b/website/templates/admin.html index 2d0889f..184ac4c 100644 --- a/website/templates/admin.html +++ b/website/templates/admin.html @@ -4,16 +4,17 @@ Admin +
-
-
+
+

Add New Image

@@ -24,9 +25,27 @@
- +

+ Images +

+
+ + + + + + + + + + + +
IDImageSpice lvl
+
+ + \ No newline at end of file