From e3adeb642fca8f2e60a77318569e73efcf9e2a07 Mon Sep 17 00:00:00 2001 From: teraflops Date: Sat, 7 Jun 2025 01:06:19 +0200 Subject: [PATCH] unfavorite fixed in user dashboard --- src/routes.py | 19 ++++++++ static/js/favorites.js | 86 +++++++++++++++++++++++++---------- templates/user_dashboard.html | 43 +++++++++--------- 3 files changed, 102 insertions(+), 46 deletions(-) diff --git a/src/routes.py b/src/routes.py index 342fe39..ac97fc9 100644 --- a/src/routes.py +++ b/src/routes.py @@ -71,6 +71,9 @@ HEADERS = { "Content-Type": "application/json" } +def get_client_ip(): + return request.headers.get("X-Forwarded-For", request.remote_addr).split(',')[0].strip() + def get_readable_languages(): """ @@ -712,6 +715,8 @@ def detect_language(content, unique_filename=None, original_filename=None, detec def init_routes(app): @app.route('/file/', methods=['GET']) def get_file(filename): + ip = get_client_ip() + current_app.logger.info(f"Vista del paste {id} desde IP: {ip}") file_path = os.path.join(UPLOAD_FOLDER, filename) if not os.path.exists(file_path): @@ -733,6 +738,8 @@ def init_routes(app): @app.route('/', methods=['GET']) def index(): + ip = get_client_ip() + current_app.logger.info(f"Vista del paste {id} desde IP: {ip}") base_url = request.host_url.rstrip('/') user_name = None @@ -763,6 +770,8 @@ def init_routes(app): @app.route('/paste//json', methods=['GET']) def get_paste_json(id): + ip = get_client_ip() + current_app.logger.info(f"Vista del paste {id} desde IP: {ip}") paste = Paste.query.get(id) if not paste: @@ -802,6 +811,8 @@ def init_routes(app): @app.route('/paste//raw', methods=['GET']) def get_paste_raw(id): + ip = get_client_ip() + current_app.logger.info(f"Vista del paste {id} desde IP: {ip}") paste = Paste.query.get(id) if not paste: @@ -971,6 +982,8 @@ def init_routes(app): @app.route('/paste/', methods=['GET']) def get_paste(id): + ip = get_client_ip() + current_app.logger.info(f"Vista del paste {id} desde IP: {ip}") paste = Paste.query.get(id) if not paste: @@ -1316,6 +1329,8 @@ def init_routes(app): ''' @app.route('/paste//download', methods=['GET']) def download_paste(id): + ip = get_client_ip() + current_app.logger.info(f"Vista del paste {id} desde IP: {ip}") paste = Paste.query.get_or_404(id) # Comprobación de permisos para pastes privados @@ -1689,6 +1704,8 @@ def init_routes(app): @app.route('/paste//download_file', methods=['GET']) def download_file(id): + ip = get_client_ip() + current_app.logger.info(f"Vista del paste {id} desde IP: {ip}") logging.info(f"Confirmed download request for paste ID: {id}") paste = Paste.query.get(id) if not paste: @@ -1733,6 +1750,8 @@ def init_routes(app): @app.route('/paste//stream_download', methods=['GET']) def stream_download(id): + ip = get_client_ip() + current_app.logger.info(f"Vista del paste {id} desde IP: {ip}") paste = Paste.query.get(id) if not paste or not paste.filename: return jsonify({"error": "Paste or file not found"}), 404 diff --git a/static/js/favorites.js b/static/js/favorites.js index 6a62687..4b5ab16 100644 --- a/static/js/favorites.js +++ b/static/js/favorites.js @@ -1,44 +1,80 @@ document.addEventListener("DOMContentLoaded", function () { const favoriteButton = document.getElementById("favorite-button"); - if (!favoriteButton) return; + if (favoriteButton) { + favoriteButton.classList.add("text-light"); - // Ajuste para visibilidad en tema oscuro - favoriteButton.classList.add("text-light"); + favoriteButton.addEventListener("click", function () { + const pasteId = document.body.dataset.pasteId; + if (!pasteId) { + console.error("Error: pasteId no definido en el ."); + return; + } - favoriteButton.addEventListener("click", function () { - const pasteId = document.body.dataset.pasteId; - if (!pasteId) { - console.error("Error: pasteId no definido en el ."); - return; - } + const isFavorited = favoriteButton.classList.contains("text-danger"); + const action = isFavorited ? "unfavorite" : "favorite"; - const isFavorited = favoriteButton.classList.contains("text-danger"); - const action = isFavorited ? "unfavorite" : "favorite"; + fetch(`/paste/${pasteId}/${action}`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + credentials: "include" + }) + .then(response => response.json()) + .then(data => { + if (data.message.includes("Added")) { + favoriteButton.classList.add("text-danger"); + favoriteButton.classList.remove("text-secondary"); + favoriteButton.setAttribute("title", "Remove from Favorites"); + } else { + favoriteButton.classList.add("text-secondary"); + favoriteButton.classList.remove("text-danger"); + favoriteButton.setAttribute("title", "Add to Favorites"); + } + showToast(data.message, "bg-success"); + }) + .catch(error => { + console.error("Error updating favorites:", error); + showToast("Error updating favorites.", "bg-danger"); + }); + }); + } - fetch(`/paste/${pasteId}/${action}`, { +document.querySelectorAll(".unfavorite-btn").forEach(button => { + button.addEventListener("click", function () { + const pasteId = this.dataset.id; + + fetch(`/paste/${pasteId}/unfavorite`, { method: "POST", - headers: { - "Content-Type": "application/json" - }, + headers: { "Content-Type": "application/json" }, credentials: "include" }) .then(response => response.json()) .then(data => { - if (data.message.includes("Added")) { - favoriteButton.classList.add("text-danger"); - favoriteButton.classList.remove("text-secondary"); - favoriteButton.setAttribute("title", "Remove from Favorites"); + if (data.success) { + const row = this.closest("tr"); + if (row) row.remove(); + + // Si ya no hay filas, mostrar mensaje vacío + const tableBody = document.querySelector("#favorites-body"); + if (tableBody && tableBody.rows.length === 0) { + tableBody.innerHTML = ` + + + No favorites yet. + + + `; + } + + showToast(data.message, "bg-success"); } else { - favoriteButton.classList.add("text-secondary"); - favoriteButton.classList.remove("text-danger"); - favoriteButton.setAttribute("title", "Add to Favorites"); + showToast(data.error || "No se pudo eliminar el favorito.", "bg-danger"); } - showToast(data.message, "bg-success"); }) .catch(error => { - console.error("Error updating favorites:", error); - showToast("Error updating favorites.", "bg-danger"); + console.error("Error:", error); + showToast("Error al eliminar favorito.", "bg-danger"); }); }); }); +}); diff --git a/templates/user_dashboard.html b/templates/user_dashboard.html index cbc408c..7df34fb 100644 --- a/templates/user_dashboard.html +++ b/templates/user_dashboard.html @@ -390,28 +390,29 @@ Actions - - {% for fav in favorite_pastes %} - - {{ fav.id }} - {{ fav.filename if fav.filename else "Paste " ~ fav.id }} - {{ fav.get_type() }} - {{ fav.size }} - {{ fav.created_at.strftime('%Y-%m-%d %H:%M:%S') }} - - - View - - - - - {% endfor %} + + {% for fav in favorite_pastes %} + + {{ fav.id }} + {{ fav.filename if fav.filename else "Paste " ~ fav.id }} + {{ fav.get_type() }} + {{ fav.size }} + {{ fav.created_at.strftime('%Y-%m-%d %H:%M:%S') }} + + + View + + + + + {% endfor %} + {% if favorite_pagination.pages > 1 %}