|
Server IP : 217.21.85.138 / Your IP : 216.73.216.103 Web Server : LiteSpeed System : Linux in-mum-web906.main-hosting.eu 4.18.0-553.37.1.lve.el8.x86_64 #1 SMP Mon Feb 10 22:45:17 UTC 2025 x86_64 User : u915722082 ( 915722082) PHP Version : 7.4.33 Disable Function : system, exec, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail MySQL : OFF | cURL : ON | WGET : ON | Perl : OFF | Python : OFF Directory (0755) : /home/u915722082/.nvm/../public_html/lohri/user/ |
| [ Home ] | [ C0mmand ] | [ Upload File ] |
|---|
<!-- shop.php -->
<?php
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
require_once __DIR__ . '/../config/config.php';
try {
$pdo = new PDO(
"mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4",
DB_USER,
DB_PASS,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]
);
} catch (PDOException $e) {
die("❌ Database connection failed: " . htmlspecialchars($e->getMessage()));
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Product Filter UI</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
<?php include "../user/header.php" ?>
<style>
@media (min-width: 1200px) and (max-width: 1599px) {
.insta-highlight-section{
padding: 40px 20px 150px !important;
}
}
/* Wishlist Offer Styles */
.wishlist-offer-badge {
display: inline-block;
background: #000;
color: white;
padding: 3px 8px;
border-radius: 3px;
font-size: 11px;
font-weight: 500;
margin-top: 5px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.product-price-cell {
display: flex;
flex-direction: column;
gap: 5px;
}
.offer-price-display {
display: flex;
flex-direction: column;
gap: 3px;
}
.offer-price-display .current-price.offer-price {
color: #000;
font-weight: 600;
font-size: 16px;
}
.offer-price-display .original-price-wishlist {
text-decoration: line-through;
color: #999;
font-size: 13px;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background-color: #fff;
}
.wishlist-container {
padding: 40px 30px;
margin-bottom:100px
}
.breadcrumb {
font-size: 14px;
color: #666;
margin-bottom: 30px;
}
.breadcrumb a {
color: #666;
text-decoration: none;
}
.breadcrumb a:hover {
text-decoration: underline;
}
.wishlist-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 40px;
}
.wishlist-title {
font-size: 27px;
font-weight: 500;
margin: 0;
}
.continue-shopping {
color: black;
background:#f2f2f2;
font-size: 14px;
cursor: pointer;
padding:12px 20px;
border-radius:4px
}
/* .wishlist-content-wrapper {
max-width: 900px;
} */
.wishlist-table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
.wishlist-table th {
/*background-color: #f8f9fa;*/
padding: 15px;
text-align: left;
font-weight: 500;
font-size: 14px;
color: #666;
border-bottom: 1px solid #ccc;
}
.wishlist-table td {
padding: 25px 15px;
border-bottom: 1px solid #e5e5e5;
vertical-align: middle;
}
.product-info-cell {
display: flex;
align-items: center;
gap: 15px;
}
.product-image {
width: 70px !important;
height: 70px !important;
object-fit: cover;
border-radius: 6px;
flex-shrink: 0;
}
.product-details {
flex-grow: 1;
}
.product-title {
font-weight: 500;
font-size: 16px;
margin-bottom: 5px;
color: #000;
}
.product-variant {
font-size: 12px;
color: #666;
margin-bottom: 0;
}
.product-price {
font-weight: 600;
font-size: 16px;
color: #000;
}
.action-buttons {
display: flex;
gap: 10px;
align-items: center;
}
.icon-btn {
width: 40px;
height: 40px;
border: none;
border-radius: 6px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.2s ease;
}
.add-to-cart-icon {
background-color: #000;
color: white;
}
.add-to-cart-icon:hover {
background-color: #333;
}
.remove-icon {
background-color: #f8f9fa;
color: #dc3545;
}
.remove-icon:hover {
background-color: #dc3545;
color: white;
}
.empty-wishlist {
text-align: center;
padding: 80px 20px;
background-color: #fafafa;
border-radius: 8px;
margin: 20px 0;
}
.empty-wishlist h5 {
font-weight: 400;
color: #666;
margin-bottom: 10px;
}
.empty-wishlist p {
color: #999;
margin-bottom: 20px;
}
/* Bulk actions styling */
.bulk-actions-header {
animation: slideDown 0.3s ease-out;
}
@keyframes slideDown {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.selected-count {
font-weight: 500;
color: #495057;
}
.bulk-action-buttons .btn {
font-size: 14px;
padding:10px 20px;
transition: all 0.2s ease;
}
/* Checkbox styling */
input[type="checkbox"] {
width: 16px;
height: 16px;
accent-color: #000;
}
/* Row selection highlight */
.wishlist-table tbody tr.selected {
background-color: #f8f9ff;
}
/* Mobile Responsive Styles for Wishlist - Matches Cart Page */
@media (max-width: 768px) {
/* Wishlist Header Styles */
.wishlist-header {
flex-direction: row;
justify-content: space-between;
align-items: center;
gap: 10px;
margin-bottom: 25px;
}
.wishlist-title {
font-size: 20px !important;
margin: 0;
flex-shrink: 0;
}
.continue-shopping {
padding: 10px 15px !important;
font-size: 12px !important;
white-space: nowrap;
}
.breadcrumb {
font-size: 12px;
margin-bottom: 20px;
}
/* Keep table structure but make it scrollable and responsive */
.wishlist-table {
display: block;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
margin-bottom: 30px;
}
.wishlist-table thead {
display: table-header-group;
}
.wishlist-table tbody {
display: table-row-group;
}
.wishlist-table th {
padding: 10px 8px !important;
font-size: 12px;
white-space: nowrap;
min-width: fit-content;
}
/* Checkbox column - minimal width */
.wishlist-table th:first-child {
min-width: 35px !important;
width: 35px !important;
padding: 10px 5px !important;
}
/* Product column */
.wishlist-table th:nth-child(2) {
min-width: 180px;
}
.wishlist-table tr {
display: table-row;
border-bottom: 1px solid #e5e5e5;
}
.wishlist-table td {
display: table-cell;
padding: 12px 8px !important;
vertical-align: middle;
font-size: 13px;
}
/* Checkbox cell - minimal width */
.wishlist-table td:first-child {
width: 35px !important;
padding: 12px 5px !important;
text-align: center;
}
/* Product Info - Keep together but make compact */
.product-info-cell {
display: flex !important;
flex-direction: row !important;
align-items: center !important;
gap: 8px !important;
min-width: 180px;
}
.product-image {
width: 50px !important;
height: 50px !important;
flex-shrink: 0;
}
.product-details {
flex: 1;
min-width: 0;
}
.product-title {
font-size: 13px !important;
margin-bottom: 3px !important;
line-height: 1.2;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.product-variant {
font-size: 11px !important;
color: #666;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* Price Cell */
.product-price {
font-size: 13px !important;
white-space: nowrap;
min-width: 60px;
}
/* Action Buttons */
.action-buttons {
display: flex;
gap: 8px;
justify-content: center;
}
.icon-btn {
width: 35px !important;
height: 35px !important;
font-size: 14px;
}
.icon-btn svg {
width: 14px;
height: 14px;
}
/* Bulk Actions Header */
.bulk-actions-header {
display: none; /* Hidden by default, shown by JS when items selected */
flex-direction: row !important;
align-items: center;
justify-content: space-between;
gap: 10px;
padding: 12px 15px !important;
background-color: #f8f9fa;
border-radius: 6px;
margin-bottom: 15px;
}
.bulk-actions-header.show {
display: flex !important;
}
.bulk-action-buttons {
display: flex;
gap: 8px;
justify-content: flex-end;
flex-wrap: nowrap;
}
.bulk-action-buttons .btn {
font-size: 11px !important;
padding: 8px 12px !important;
white-space: nowrap;
border-radius: 4px;
}
.bulk-action-buttons .btn-dark {
background-color: #000 !important;
border-color: #000 !important;
}
.bulk-action-buttons .btn-outline-danger {
border-width: 1px !important;
}
.selected-count {
font-size: 13px;
flex-shrink: 0;
font-weight: 500;
}
/* Checkbox */
input[type="checkbox"] {
width: 16px;
height: 16px;
cursor: pointer;
}
/* Empty Wishlist Mobile Styles */
.empty-wishlist {
padding: 40px 20px;
}
.empty-wishlist h5 {
font-size: 18px;
margin-bottom: 15px;
}
.empty-wishlist p {
font-size: 14px;
}
.empty-wishlist .btn {
padding: 12px 24px;
font-size: 14px;
}
/* Container padding */
.wishlist-container {
padding: 20px 15px !important;
margin-bottom: 30px !important;
}
}
/* Extra Small Devices (smaller phones) */
@media (max-width: 480px) {
.wishlist-title {
font-size: 18px !important;
}
.wishlist-table th {
padding: 8px 6px !important;
font-size: 11px;
}
/* Checkbox column extra small */
.wishlist-table th:first-child {
min-width: 30px !important;
width: 30px !important;
padding: 8px 4px !important;
}
.wishlist-table td {
padding: 10px 6px !important;
font-size: 12px;
}
/* Checkbox cell extra small */
.wishlist-table td:first-child {
width: 30px !important;
padding: 10px 4px !important;
}
.product-image {
width: 45px !important;
height: 45px !important;
}
.product-title {
font-size: 12px !important;
}
.product-variant {
font-size: 10px !important;
}
.product-info-cell {
min-width: 150px;
gap: 6px !important;
}
.product-price {
font-size: 12px !important;
min-width: 55px;
}
.icon-btn {
width: 32px !important;
height: 32px !important;
font-size: 12px;
}
.icon-btn svg {
width: 12px;
height: 12px;
}
input[type="checkbox"] {
width: 14px;
height: 14px;
cursor: pointer;
}
/* Bulk actions - stack on very small screens */
.bulk-actions-header {
flex-direction: column !important;
align-items: flex-start;
gap: 10px;
}
.bulk-action-buttons {
width: 100%;
justify-content: flex-start;
flex-wrap: wrap;
margin-left: 10px;
}
.bulk-action-buttons .btn {
font-size: 10px !important;
padding: 7px 10px !important;
}
.selected-count {
font-size: 12px;
}
}
/* Tablet Landscape */
@media (min-width: 769px) and (max-width: 1024px) {
.wishlist-table th,
.wishlist-table td {
padding: 12px 10px !important;
font-size: 14px;
}
.product-image {
width: 60px !important;
height: 60px !important;
}
.product-title {
font-size: 15px !important;
}
.icon-btn {
width: 38px !important;
height: 38px !important;
}
.wishlist-container {
padding: 30px 20px;
}
}
</style>
</head>
<body>
<?php include "../ui/nav.php"; ?>
<div class="wishlist-container container">
<!-- Breadcrumb -->
<style>
.breadcrumb-item.active{
color:black;
font-size: 16px;
}
</style>
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="index.php">Home</a></li>
<li class="breadcrumb-item active" aria-current="page">My Wishlist</li>
</ol>
</nav>
<!-- Wishlist Header -->
<div class="wishlist-header">
<h1 class="wishlist-title">My Wishlist</h1>
<span class="continue-shopping" onclick="continueShopping()">Continue Shopping</span>
</div>
<!-- Wishlist Content -->
<div class="wishlist-content-wrapper">
<div id="wishlistContent">
<div class="text-center py-5">
<p>Loading wishlist...</p>
</div>
</div>
</div>
</div>
<?php include "../ui/footer.php"; ?>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script>
let wishlistData = [];
function loadWishlistData() {
fetch('get_wishlist_items.php')
.then(response => response.json())
.then(data => {
console.log('Wishlist data loaded:', data);
if (data.success) {
document.getElementById('wishlistContent').innerHTML = data.html;
// Update wishlist count in navbar if function exists
if (typeof window.updateWishlistDisplay === 'function') {
window.updateWishlistDisplay();
}
} else {
document.getElementById('wishlistContent').innerHTML = `
<div class="empty-wishlist">
<h5>Error loading wishlist</h5>
<p>Please refresh the page to try again</p>
<button onclick="loadWishlistData()" class="btn btn-dark">Retry</button>
</div>
`;
}
})
.catch(error => {
console.error('Error loading wishlist data:', error);
document.getElementById('wishlistContent').innerHTML = `
<div class="empty-wishlist">
<h5>Error loading wishlist</h5>
<p>Please refresh the page to try again</p>
<button onclick="loadWishlistData()" class="btn btn-dark">Retry</button>
</div>
`;
});
}
// Checkbox functionality
function toggleSelectAll() {
const selectAllCheckbox = document.getElementById('selectAll');
const itemCheckboxes = document.querySelectorAll('.item-checkbox');
itemCheckboxes.forEach(checkbox => {
checkbox.checked = selectAllCheckbox.checked;
updateRowSelection(checkbox);
});
updateBulkActions();
}
function updateBulkActions() {
const itemCheckboxes = document.querySelectorAll('.item-checkbox');
const checkedCheckboxes = document.querySelectorAll('.item-checkbox:checked');
const selectAllCheckbox = document.getElementById('selectAll');
const bulkActionsHeader = document.getElementById('bulkActionsHeader');
const selectedCount = document.querySelector('.selected-count');
// Update select all checkbox state
if (selectAllCheckbox) {
if (checkedCheckboxes.length === 0) {
selectAllCheckbox.indeterminate = false;
selectAllCheckbox.checked = false;
} else if (checkedCheckboxes.length === itemCheckboxes.length) {
selectAllCheckbox.indeterminate = false;
selectAllCheckbox.checked = true;
} else {
selectAllCheckbox.indeterminate = true;
selectAllCheckbox.checked = false;
}
}
// Show/hide bulk actions
if (checkedCheckboxes.length > 0) {
bulkActionsHeader.style.display = 'block';
selectedCount.textContent = `${checkedCheckboxes.length} item${checkedCheckboxes.length > 1 ? 's' : ''}`;
} else {
bulkActionsHeader.style.display = 'none';
}
// Update row selection visual
itemCheckboxes.forEach(checkbox => {
updateRowSelection(checkbox);
});
}
function updateRowSelection(checkbox) {
const row = checkbox.closest('tr');
if (checkbox.checked) {
row.classList.add('selected');
} else {
row.classList.remove('selected');
}
}
// Bulk operations
function bulkAddToCart() {
const checkedCheckboxes = document.querySelectorAll('.item-checkbox:checked');
const wishlistKeys = Array.from(checkedCheckboxes).map(cb => cb.value);
if (wishlistKeys.length === 0) {
alert('Please select items to add to cart');
return;
}
const confirmMessage = `Add ${wishlistKeys.length} item${wishlistKeys.length > 1 ? 's' : ''} to cart?`;
if (!confirm(confirmMessage)) {
return;
}
// Disable bulk buttons
const bulkButtons = document.querySelectorAll('.bulk-action-buttons .btn');
bulkButtons.forEach(btn => btn.disabled = true);
fetch('update_wishlist.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: `action=bulk_add_to_cart&wishlist_keys=${encodeURIComponent(JSON.stringify(wishlistKeys))}`
})
.then(response => response.json())
.then(data => {
console.log('Bulk add to cart response:', data);
if (data.success) {
// Update cart + wishlist counts if available
if (typeof window.updateCartDisplay === 'function') {
window.updateCartDisplay();
}
if (typeof window.updateWishlistDisplay === 'function') {
window.updateWishlistDisplay();
}
// Show cart offcanvas
const cartOffcanvas = document.getElementById('cartOffcanvas');
if (cartOffcanvas && window.bootstrap) {
const offcanvas = bootstrap.Offcanvas.getOrCreateInstance(cartOffcanvas);
offcanvas.show();
}
// Show success message
alert(data.message || 'Items added to cart successfully');
// Reload wishlist
loadWishlistData();
} else {
console.error('Bulk add to cart failed:', data.message);
alert(data.message || 'Failed to add items to cart');
}
})
.catch(error => {
console.error('Error in bulk add to cart:', error);
alert('Network error occurred while adding items to cart');
})
.finally(() => {
// Re-enable bulk buttons
bulkButtons.forEach(btn => btn.disabled = false);
});
}
function bulkRemoveFromWishlist() {
const checkedCheckboxes = document.querySelectorAll('.item-checkbox:checked');
const wishlistKeys = Array.from(checkedCheckboxes).map(cb => cb.value);
if (wishlistKeys.length === 0) {
alert('Please select items to remove');
return;
}
const confirmMessage = `Remove ${wishlistKeys.length} item${wishlistKeys.length > 1 ? 's' : ''} from your wishlist?`;
if (!confirm(confirmMessage)) {
return;
}
fetch('update_wishlist.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: `action=bulk_remove&wishlist_keys=${encodeURIComponent(JSON.stringify(wishlistKeys))}`
})
.then(response => response.json())
.then(data => {
if (data.success) {
// Show success message
alert(data.message || 'Items removed successfully');
// Reload wishlist
loadWishlistData();
// Update wishlist count if function exists
if (typeof window.updateWishlistDisplay === 'function') {
window.updateWishlistDisplay();
}
} else {
alert(data.message || 'Failed to remove items');
}
})
.catch(error => {
console.error('Error in bulk remove:', error);
alert('Error removing items from wishlist');
});
}
// Individual operations (existing functionality)
function addToCartFromWishlist(wishlistKey) {
// Find button by wishlist key in onclick attribute
const buttons = document.querySelectorAll('button[onclick*="addToCartFromWishlist"]');
let button = null;
buttons.forEach(btn => {
if (btn.getAttribute('onclick').includes(wishlistKey)) {
button = btn;
}
});
if (button) {
button.disabled = true; // disable while processing
}
fetch('update_wishlist.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: `action=add_to_cart_from_wishlist&wishlist_key=${encodeURIComponent(wishlistKey)}`
})
.then(response => response.json())
.then(data => {
console.log('Add to cart response:', data);
if (data.success) {
// Update cart + wishlist counts if available
if (typeof window.updateCartDisplay === 'function') {
window.updateCartDisplay();
}
if (typeof window.updateWishlistDisplay === 'function') {
window.updateWishlistDisplay();
}
// Show cart offcanvas
const cartOffcanvas = document.getElementById('cartOffcanvas');
if (cartOffcanvas && window.bootstrap) {
const offcanvas = bootstrap.Offcanvas.getOrCreateInstance(cartOffcanvas);
offcanvas.show();
}
// Reload wishlist to remove the item
setTimeout(() => {
loadWishlistData();
}, 1000);
} else {
console.error('Add to cart failed:', data.message);
alert(data.message || 'Failed to add to cart');
}
})
.catch(error => {
console.error('Error adding to cart:', error);
alert('Network error occurred while adding to cart');
})
.finally(() => {
if (button) {
button.disabled = false; // re-enable after request
}
});
}
function removeFromWishlist(wishlistKey) {
if (confirm('Remove this item from your wishlist?')) {
fetch('update_wishlist.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: `action=remove_item&wishlist_key=${wishlistKey}`
})
.then(response => response.json())
.then(data => {
if (data.success) {
loadWishlistData(); // Reload wishlist
// Update wishlist count if function exists
if (typeof window.updateWishlistDisplay === 'function') {
window.updateWishlistDisplay();
}
} else {
alert(data.message || 'Failed to remove item');
}
})
.catch(error => {
console.error('Error removing from wishlist:', error);
alert('Error removing item from wishlist');
});
}
}
function continueShopping() {
window.location.href = 'shop.php';
}
// Initialize wishlist on page load
document.addEventListener('DOMContentLoaded', function() {
loadWishlistData();
});
</script>
</body>
</html>