Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@
</head>
<body>
<header id="store">
<input type="text" id="search" placeholder="Search items..." />
<div id="sort-buttons">
<button id="sort-price">Sort by Price</button>
<button id="sort-name">Sort Alphabetically</button>
</div>
<h1>Greengrocers</h1>
<ul class="item-list store--item-list">
<!-- Take a look at store-item.html -->
Expand Down
151 changes: 150 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,153 @@ const state = {
}
],
cart: []
};
};

const storeItemList = document.querySelector('.store--item-list');
const searchInput = document.getElementById('search');
const sortPriceButton = document.getElementById('sort-price');
const sortNameButton = document.getElementById('sort-name');
let currentSort = null;
function displayItems(filteredItems = state.items) {
storeItemList.innerHTML = '';
filteredItems.forEach(item => {
const listItem = document.createElement('li');
const itemIcon = document.createElement('div');
listItem.id = item.id;
listItem.dataset.price = item.price;
listItem.dataset.itemName = item.name;
itemIcon.className = 'store--item-icon';

const itemImg = document.createElement('img');
itemImg.src = `assets/icons/${item.id}.svg`;
itemImg.alt = item.name;

itemIcon.appendChild(itemImg);

const addButton = document.createElement('button');
addButton.textContent = 'Add to cart';
addButton.onclick = () => addToCart(item.id, item.name, item.price);

listItem.appendChild(itemIcon);
listItem.appendChild(addButton);

storeItemList.appendChild(listItem);
});
}
function filterItems() {
const searchText = searchInput.value.toLowerCase();
let filteredItems = state.items.filter(item =>
item.name.toLowerCase().includes(searchText)
);

if (currentSort === 'price') {
filteredItems.sort((a, b) => a.price - b.price);
} else if (currentSort === 'name') {
filteredItems.sort((a, b) => a.name.localeCompare(b.name));
}

displayItems(filteredItems);
}

function sortByPrice() {
currentSort = 'price';
filterItems();
}
function sortByName() {
currentSort = 'name';
filterItems();
}

searchInput.addEventListener('input', filterItems);
sortPriceButton.addEventListener('click', sortByPrice);
sortNameButton.addEventListener('click', sortByName);


const cartItemList = document.querySelector('.cart--item-list');

function addToCart(id, name, price) {
let listItem;
const cartItemId = `cart-${id}`;
if (!itemExistsInCart(cartItemId)) {
listItem = document.createElement('li');
listItem.id = cartItemId;
listItem.className = 'cart-list-item';
listItem.dataset.price = price;

const itemImg = document.createElement('img');
itemImg.className = 'cart--item-icon';
itemImg.src = `assets/icons/${id}.svg`;
itemImg.alt = name;
listItem.appendChild(itemImg);

const itemName = document.createElement('p');
itemName.textContent = name;
listItem.appendChild(itemName);

const decrementButton = document.createElement('button');
decrementButton.className = 'quantity-btn remove-btn center';
decrementButton.textContent = '-';
decrementButton.onclick = () => decrement(cartItemId);
listItem.appendChild(decrementButton);

const quantitySpan = document.createElement('span');
quantitySpan.className = 'quantity-text center';
quantitySpan.textContent = '1';
listItem.appendChild(quantitySpan);

const incrementButton = document.createElement('button');
incrementButton.className = 'quantity-btn add-btn center';
incrementButton.textContent = '+';
incrementButton.onclick = () => increment(cartItemId);
listItem.appendChild(incrementButton);

cartItemList.appendChild(listItem);
} else {
listItem = document.getElementById(cartItemId);
increment(cartItemId);
}
calcTotal();
}

function increment(cartItemId) {
const listItem = document.getElementById(cartItemId);
const quantitySpan = listItem.querySelector('.quantity-text');
let currentValue = parseInt(quantitySpan.textContent);
quantitySpan.textContent = currentValue + 1;
calcTotal();
}

function decrement(cartItemId) {
const listItem = document.getElementById(cartItemId);
const quantitySpan = listItem.querySelector('.quantity-text');
let currentValue = parseInt(quantitySpan.textContent);
if (currentValue > 1) {
quantitySpan.textContent = currentValue - 1;
} else {
listItem.remove();
}
calcTotal();
}

function itemExistsInCart(id) {
const cartItemList = document.querySelector('.cart--item-list');
return cartItemList.querySelector(`#${id}`) !== null;
}

function calcTotal() {
const cartItems = document.querySelectorAll('.cart--item-list li');
const totalElement = document.querySelector('.total-number');
let total = 0;

cartItems.forEach(item => {
const quantitySpan = item.querySelector('.quantity-text');
const quantity = parseInt(quantitySpan.textContent);
const price = parseFloat(item.dataset.price);
total += price * quantity;
});

totalElement.innerHTML = "£" + total.toFixed(2);
}


displayItems();
8 changes: 8 additions & 0 deletions styles/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -176,9 +176,17 @@ button {
font-weight: bold;
}

.cart-list-item{
display: flex;
}



@media only screen and (max-width: 450px) {
.total-section {
border-top: 2px solid #00675b;
border-bottom: 2px solid #00675b;
}
}