<!doctype html> <html data-theme="light" class="has-navbar-fixed-top"> <head> <title>{{ tmp }} - {{ title }}</title> <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, initial-scale=1.0"> <!-- CSS Reset --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@1.0.0/css/bulma.min.css"> <script src="https://www.kryogenix.org/code/browser/sorttable/sorttable.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js" integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> <style> table.sortable th:not(.sorttable_sorted):not(.sorttable_sorted_reverse):not(.sorttable_nosort):after { content: " \25B4\25BE" } table.sortable tbody tr:nth-child(2n) td { background: #ffffff; } table.sortable tbody tr:nth-child(2n+1) td { background: #ecf0f1; } .hidden { display: none; } table { width: 100%; /* Ensure the table takes full width of its container */ } td { overflow: hidden; text-overflow: ellipsis; word-wrap: break-word; } .name-class { max-width: 300px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } @media only screen and (min-width: 600px) { .hidden-desktop { display: none; } } @media only screen and (max-width: 480px) { /* horizontal scrollbar for tables if mobile screen */ .hidden-mobile { display: none; } } /* Chrome, Safari, Edge, Opera */ input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; } /* Firefox */ input[type=number] { -moz-appearance: textfield; } .header { width:100%; text-align:center; z-index: 99; background-color: white; } .content { padding: 16px; } .inputContainer { display: inline-block; /* Display as an inline block */ vertical-align: middle; /* Center vertically within the cell */ width: 120px; } .inputContainer form { margin: 5% auto 5% auto; } .inputField { display: flex; align-items: center; /* Align items vertically */ width: 100%; /* Ensure inputField fills out inputContainer */ height: 100%; /* Ensure inputField fills out inputContainer */ } .inputField input { flex: 1; width: 70%; padding: 0px; margin: auto 2.5px auto 2.5px; } .inputField button { width: 30%; padding: 0px; margin: 0 2.5px 0 2.5px; } .square-button { background-color: white; border: 1px solid #d1d1d1; } /* Modal Styles */ #lightbox-modal { display: none; position: fixed; z-index: 1000; padding-top: 50px; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.5); } .lightbox-wrapper { position: relative; width: 100%; height: 100%; } .lightbox-content { max-width: 90%; max-height: 90%; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } #lightbox-text { position: absolute; bottom: 20px; /* Adjust as needed */ left: 50%; transform: translateX(-50%); padding: 10px; background-color: rgba(0, 0, 0, 0.5); /* Adjust background color and opacity */ color: white; text-align: center; } #lightbox-modal .close { position: absolute; top: 10px; right: 25px; font-size: 50px; color: white; cursor: pointer; } #lightbox-modal img { display: block; margin: 0 auto; max-width: 90%; max-height: 90%; } </style> </head> <body> <nav class="navbar is-dark is-fixed-top is-size-6" role="navigation" aria-label="main navigation"> <div class="navbar-brand"> <a class="navbar-item" href="/"> Home </a> {% if minifig_list | length > 0 %} <a class="navbar-item" href="#minifigs">Jump2Figs</a> {% endif %} <a class="navbar-item hidden-desktop" id="expand-button"> Expand Columns </a> <a class="navbar-item" id="filter-button"> Missing Parts </a> <a class="navbar-item hidden-desktop js-modal-trigger" data-target="modal-delete-set" > Delete </a> </div> <div id="navMenu" class="navbar-menu"> <div class="navbar-end"> <!-- <a class="navbar-item" onclick="delete_set('{{ u_id }}','{{ tmp }}', '{{ title }}')"> Delete </a> --> <a class="navbar-item js-modal-trigger" data-target="modal-delete-set"> Delete </a> </div> </div> </nav> <div class="modal" id="modal-delete-set"> <div class="modal-background"></div> <div class="modal-card"> <header class="modal-card-head"> <p class="modal-card-title">Delete set?</p> <button class="delete" aria-label="close"></button> </header> <section class="modal-card-body"> Are you sure you want to delete: <br> <b>{{ tmp }} - {{ title }}</b> <br><br> With unique ID: <br><b>{{ u_id }}</b> </section> <footer class="modal-card-foot"> <div class="buttons"> <a href="{{ '/delete/' + u_id }}" class="button is-danger">Delete</a> <button class="button">Cancel</button> </div> </footer> </div> </div> <div class="container"> <center> <h1 class="title">{{ tmp }} - {{ title }}</h1> <img class="lightbox-trigger" id="cover" style='height: 150px; width: auto; object-fit: contain' src="/static/sets/{{ tmp }}.jpg" alt="{{ tmp }} - {{ title }}"> {% block content %}{% endblock %} </div> {% block scripts %}{% endblock %} </body> <script> function delete_set(u_id,tmp,title) { let text = ""; if (confirm(text) == true) { text = "You pressed OK!"; } else { text = "You canceled!"; } document.getElementById("demo").innerHTML = text; } document.addEventListener('DOMContentLoaded', () => { // Functions to open and close a modal function openModal($el) { $el.classList.add('is-active'); } function closeModal($el) { $el.classList.remove('is-active'); } function closeAllModals() { (document.querySelectorAll('.modal') || []).forEach(($modal) => { closeModal($modal); }); } // Add a click event on buttons to open a specific modal (document.querySelectorAll('.js-modal-trigger') || []).forEach(($trigger) => { const modal = $trigger.dataset.target; const $target = document.getElementById(modal); $trigger.addEventListener('click', () => { openModal($target); }); }); // Add a click event on various child elements to close the parent modal (document.querySelectorAll('.modal-background, .modal-close, .modal-card-head .delete, .modal-card-foot .button') || []).forEach(($close) => { const $target = $close.closest('.modal'); $close.addEventListener('click', () => { closeModal($target); }); }); // Add a keyboard event to close all modals document.addEventListener('keydown', (event) => { if(event.key === "Escape") { closeAllModals(); } }); }); /* document.getElementById("filter-button").addEventListener("click", () => { const table = document.getElementById("data"); const rows = table.querySelectorAll("tbody tr"); // Check if any rows are currently hidden const isFiltered = Array.from(rows).some(row => row.classList.contains("hidden")); rows.forEach(row => { const inputField = row.querySelector("input#missing"); if (inputField) { const inputValue = inputField.value.trim(); if (isFiltered) { // If currently filtered, show all rows row.classList.remove("hidden"); } else { // If not filtered, hide rows with empty input fields if (inputValue === "") { row.classList.add("hidden"); } } } }); // Update button text based on the state document.getElementById("filter-button").textContent = isFiltered ? "Only Show Missing" : "Show All Parts"; }); */ document.getElementById("filter-button").addEventListener("click", () => { const tables = document.querySelectorAll("#data"); // Select all tables with the class 'data-table' let isFiltered = false; // Check if any row in any table is hidden tables.forEach(table => { const rows = table.querySelectorAll("tbody tr"); if (Array.from(rows).some(row => row.classList.contains("hidden"))) { isFiltered = true; } }); // Apply toggle logic to each table tables.forEach(table => { const rows = table.querySelectorAll("tbody tr"); rows.forEach(row => { const inputField = row.querySelector("input#missing"); if (inputField) { const inputValue = inputField.value.trim(); if (isFiltered) { row.classList.remove("hidden"); } else { if (inputValue === "") { row.classList.add("hidden"); } } } }); }); // Update button text based on the state document.getElementById("filter-button").textContent = isFiltered ? "Missing Parts" : "All Parts"; }); </script> </html>