From d6b62a7f6e945319d036a3c671ce69a8ac8d5e43 Mon Sep 17 00:00:00 2001 From: Ali Imam Date: Thu, 13 Nov 2025 12:04:29 +0600 Subject: [PATCH 1/4] [EmperorAlii] Initial commit for 007-e-commerce --- 007-e-commerce/EmperorAlii/js/app.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 007-e-commerce/EmperorAlii/js/app.js diff --git a/007-e-commerce/EmperorAlii/js/app.js b/007-e-commerce/EmperorAlii/js/app.js new file mode 100644 index 00000000..e69de29b From 4dba73e255f316e8507c63920168844f6110f805 Mon Sep 17 00:00:00 2001 From: Ali Imam Date: Mon, 15 Dec 2025 12:45:18 +0600 Subject: [PATCH 2/4] [EmperorAlii] Add cart update feature --- .../assets/images/product-placeholder.webp | Bin 0 -> 29694 bytes 007-e-commerce/EmperorAlii/index.html | 51 ++++++ 007-e-commerce/EmperorAlii/js/app.js | 0 007-e-commerce/EmperorAlii/js/script.js | 146 ++++++++++++++++++ 4 files changed, 197 insertions(+) create mode 100644 007-e-commerce/EmperorAlii/assets/images/product-placeholder.webp create mode 100644 007-e-commerce/EmperorAlii/index.html delete mode 100644 007-e-commerce/EmperorAlii/js/app.js create mode 100644 007-e-commerce/EmperorAlii/js/script.js diff --git a/007-e-commerce/EmperorAlii/assets/images/product-placeholder.webp b/007-e-commerce/EmperorAlii/assets/images/product-placeholder.webp new file mode 100644 index 0000000000000000000000000000000000000000..f13c6ae5bac480907eb507fcde83108556bd0133 GIT binary patch literal 29694 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 QuSX1kBmB7n2!DY1f3M83;{X5v literal 0 HcmV?d00001 diff --git a/007-e-commerce/EmperorAlii/index.html b/007-e-commerce/EmperorAlii/index.html new file mode 100644 index 00000000..fdae9a16 --- /dev/null +++ b/007-e-commerce/EmperorAlii/index.html @@ -0,0 +1,51 @@ + + + + + + Simple E-commerce + + + + +
+
+

Simple E-commerce

+
+
+ + +
+
+
+
+
+

Cart

+
    +

    + +
    +
    +
    + + + + diff --git a/007-e-commerce/EmperorAlii/js/app.js b/007-e-commerce/EmperorAlii/js/app.js deleted file mode 100644 index e69de29b..00000000 diff --git a/007-e-commerce/EmperorAlii/js/script.js b/007-e-commerce/EmperorAlii/js/script.js new file mode 100644 index 00000000..cde2dead --- /dev/null +++ b/007-e-commerce/EmperorAlii/js/script.js @@ -0,0 +1,146 @@ +const products = [ + { + id: 1, + name: 'Gaming Laptop', + price: 1500, + image: './assets/images/product-placeholder.webp', + categories: ['Laptops', 'Gaming'], + }, + { + id: 2, + name: 'Wireless Mouse', + price: 50, + image: './assets/images/product-placeholder.webp', + categories: ['Accessories', 'Peripherals'], + }, + { + id: 3, + name: 'Mechanical Keyboard', + price: 100, + image: './assets/images/product-placeholder.webp', + categories: ['Accessories', 'Peripherals'], + }, + { + id: 4, + name: 'External Hard Drive', + price: 120, + image: './assets/images/product-placeholder.webp', + categories: ['Storage', 'Accessories'], + }, + { + id: 5, + name: 'Graphics Card', + price: 500, + image: './assets/images/product-placeholder.webp', + categories: ['Components', 'Gaming'], + }, + { + id: 6, + name: 'Portable SSD', + price: 200, + image: './assets/images/product-placeholder.webp', + categories: ['Storage', 'Accessories'], + }, + { + id: 7, + name: 'Gaming Monitor', + price: 300, + image: './assets/images/product-placeholder.webp', + categories: ['Monitors', 'Gaming'], + }, + { + id: 8, + name: 'All-in-One Printer', + price: 150, + image: './assets/images/product-placeholder.webp', + categories: ['Peripherals', 'Printers'], + }, +]; + +// Array to hold cart items +const cart = []; + +//function to render products on the page +function renderProducts() { + const productGrid = document.getElementById('product-grid'); + + productGrid.innerHTML = ''; + + //Looping through the product list + products.forEach((product) => { + const card = makeCard(product); + productGrid.appendChild(card); + }); +} + +//function to create a product card +function makeCard(product) { + //making necessary elements for the card + const cardContainer = document.createElement('div'); + const cardImage = document.createElement('img'); + const cardTitle = document.createElement('h3'); + const cardPrice = document.createElement('div'); + const addToCartBtn = document.createElement('button'); + + //adding classes to the elements + cardImage.src = product.image; + cardTitle.innerText = product.name; + cardPrice.innerText = `$${product.price}`; + addToCartBtn.innerText = 'Add To Cart'; + + //adding items to the cart + addToCartBtn.addEventListener('click', () => { + addProductToCart(product); + }); + + //appending elements to the card container + cardContainer.appendChild(cardImage); + cardContainer.appendChild(cardTitle); + cardContainer.appendChild(cardPrice); + cardContainer.appendChild(addToCartBtn); + + //adding styles to the elements + cardContainer.className = + 'bg-white shadow p-4 rounded flex flex-col items-center'; + cardImage.className = 'w-full mb-2'; + cardTitle.className = 'text-lg font-semibold mb-1'; + cardPrice.className = 'text-gray-700 mb-2'; + addToCartBtn.className = + 'bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded'; + + return cardContainer; +} + +//function to render cart +function renderCart() { + const cartItemContainer = document.getElementById('cart-items'); + + cartItemContainer.innerHTML = ''; + + cart.forEach((product) => { + const cartItem = document.createElement('li'); + cartItem.innerText = `${product.name} X ${product.quantity}`; + cartItemContainer.appendChild(cartItem); + }); +} + +//function which will be called each time add to cart is clicked +function addProductToCart(product) { + // checking if the product already in the cart + const haveProductInTheCart = cart.find( + (currentProduct) => product.name === currentProduct.name + ); + + // Logic to update cart + if (haveProductInTheCart) { + haveProductInTheCart.quantity++; + } else { + cart.push({ ...product, quantity: 1 }); + } + + //render cart after update + renderCart(); +} + +//function call to render all products +renderProducts(); From 87f860a75aafaa5e4d11354a82cdc0aa51ae9745 Mon Sep 17 00:00:00 2001 From: Ali Imam Date: Mon, 15 Dec 2025 14:53:08 +0600 Subject: [PATCH 3/4] [EmperorAlii] Add cart items to local storage to hold cart items --- 007-e-commerce/EmperorAlii/js/script.js | 81 ++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 2 deletions(-) diff --git a/007-e-commerce/EmperorAlii/js/script.js b/007-e-commerce/EmperorAlii/js/script.js index cde2dead..2e90171d 100644 --- a/007-e-commerce/EmperorAlii/js/script.js +++ b/007-e-commerce/EmperorAlii/js/script.js @@ -113,15 +113,76 @@ function makeCard(product) { //function to render cart function renderCart() { + // Getting the cart item container and creating total price view element const cartItemContainer = document.getElementById('cart-items'); + const totalPriceView = document.createElement('li'); + // Variable to hold total price + var totalPrice = 0; + // Clearing the cart cartItemContainer.innerHTML = ''; + //rendering each of the cart item cart.forEach((product) => { const cartItem = document.createElement('li'); - cartItem.innerText = `${product.name} X ${product.quantity}`; + cartItem.innerHTML = ` + ${product.name} x ${product.quantity} +
    + + + +
    + `; + + // Getting buttons for adding removing quantity and removing the item from cart + const plusBtn = cartItem.querySelector('.plus'); + const minusBtn = cartItem.querySelector('.minus'); + const removeBtn = cartItem.querySelector('.remove'); + + // Event listener for plus button + plusBtn.addEventListener('click', () => { + product.quantity++; + + // Updating cart after quantity change + saveCartToLocalStorage(); + renderCart(); + }); + + // Event listener for minus button + minusBtn.addEventListener('click', () => { + if (product.quantity > 1) product.quantity--; + else { + alert( + 'Quantity cannot be less than 1. To remove the item, click on Remove button.' + ); + } + + // Updating cart after quantity change + saveCartToLocalStorage(); + renderCart(); + }); + + // Event Listener for remove button + removeBtn.addEventListener('click', () => { + indexOfProduct = cart.indexOf(product); + if (indexOfProduct > -1) cart.splice(indexOfProduct, 1); + + // Updating cart after removal + saveCartToLocalStorage(); + renderCart(); + }); + + // Appending cart item to the cart container and updating total price cartItemContainer.appendChild(cartItem); + totalPrice += product.price * product.quantity; }); + + totalPriceView.innerHTML = `
    + Total: + $${totalPrice} +
    `; + + cartItemContainer.appendChild(totalPriceView); } //function which will be called each time add to cart is clicked @@ -139,8 +200,24 @@ function addProductToCart(product) { } //render cart after update + saveCartToLocalStorage(); renderCart(); } -//function call to render all products +//functions to save cart item in local storage +function saveCartToLocalStorage() { + localStorage.setItem('cart', JSON.stringify(cart)); +} + +//function to load cart items from local storage +function loadCartFromLocalStorage() { + const savedCart = localStorage.getItem('cart'); + if (savedCart) { + cart.push(...JSON.parse(savedCart)); + } +} + +//function call to render all products, cart initially on page load +loadCartFromLocalStorage(); renderProducts(); +renderCart(); From fc2dafc71ca616e6a7a373e855fb6396866328d3 Mon Sep 17 00:00:00 2001 From: Ali Imam Date: Sun, 21 Dec 2025 03:22:35 +0600 Subject: [PATCH 4/4] [EmperorAlii] Added most of the core features --- 007-e-commerce/EmperorAlii/js/script.js | 119 +++++++++++++++++++++++- 1 file changed, 114 insertions(+), 5 deletions(-) diff --git a/007-e-commerce/EmperorAlii/js/script.js b/007-e-commerce/EmperorAlii/js/script.js index 2e90171d..be19c169 100644 --- a/007-e-commerce/EmperorAlii/js/script.js +++ b/007-e-commerce/EmperorAlii/js/script.js @@ -57,22 +57,110 @@ const products = [ }, ]; +//////////////////////Global variables////////////////// + // Array to hold cart items const cart = []; +// Extracting unique categories from products +const categories = [ + ...new Set(products.flatMap((product) => product.categories)), +]; + +/////////////////////////////////////////////////////// + +//function to render filter buttons +function renderFilterButtons() { + const categoryFilter = document.getElementById('category-filters'); + + //Creating category filters + categories.forEach((category) => { + // Creating button for each category + const categoryBtn = document.createElement('button'); + categoryBtn.innerText = category; + categoryBtn.dataset.category = category; + categoryBtn.className = + 'bg-blue-200 hover:bg-gray-300 text-gray-800 font-semibold py-2 px-4 rounded transition-colors duration-200'; + categoryFilter.className = 'grid grid-cols-4 gap-4 mb-6'; + categoryFilter.appendChild(categoryBtn); + }); +} + //function to render products on the page -function renderProducts() { +function renderProducts(defaultProductsToRender = products) { + const categoryButtons = document.querySelectorAll('#category-filters button'); + const applyButton = document.getElementById('apply-filters-btn'); + const clearButton = document.getElementById('clear-filters-btn'); + const categoryList = loadFiltersFromLocalStorage(); + + // Getting selected categories on button click + categoryButtons.forEach((button) => { + button.addEventListener('click', () => { + if (!categoryList.includes(button.textContent)) { + categoryList.push(button.textContent); + saveFiltersToLocalStorage(categoryList); + } + button.classList.add('bg-blue-500', 'text-white'); + button.classList.remove('bg-blue-200', 'text-gray-800'); + }); + }); + + // Rendering products based on selected categories + applyButton.addEventListener('click', () => { + const filteredProductsToRender = filterProductsByCategory(categoryList); + + // Updating product UI based on filtered products + if (filteredProductsToRender.length > 0) + updateProductUI(filteredProductsToRender); + }); + + // Clearing selected categories and resetting product view + clearButton.addEventListener('click', () => { + categoryList.length = 0; + categoryButtons.forEach((button) => { + button.classList.remove('bg-blue-500', 'text-white'); + button.classList.add('bg-blue-200', 'text-gray-800'); + }); + updateProductUI(defaultProductsToRender); + }); + + // Initial render of products + if (categoryList.length > 0) { + const filteredProductsToRender = filterProductsByCategory(categoryList); + updateProductUI(filteredProductsToRender); + } else { + updateProductUI(defaultProductsToRender); + } +} + +//function to update product UI +function updateProductUI(productsToRender) { const productGrid = document.getElementById('product-grid'); + // Clearing existing products productGrid.innerHTML = ''; - - //Looping through the product list - products.forEach((product) => { + // Rendering products + productsToRender.forEach((product) => { const card = makeCard(product); productGrid.appendChild(card); }); } +// function to filter products based on category +function filterProductsByCategory(categoryList) { + const filteredProducts = []; + + products.forEach((product) => { + if ( + product.categories.some((category) => categoryList.includes(category)) + ) { + filteredProducts.push(product); + } + }); + + return filteredProducts; +} + //function to create a product card function makeCard(product) { //making necessary elements for the card @@ -217,7 +305,28 @@ function loadCartFromLocalStorage() { } } -//function call to render all products, cart initially on page load +//functions to save and load filters from local storage +function saveFiltersToLocalStorage(selectedCategories) { + localStorage.setItem( + 'selectedCategories', + JSON.stringify(selectedCategories) + ); +} +//function to load filters from local storage +function loadFiltersFromLocalStorage() { + const savedFilters = localStorage.getItem('selectedCategories'); + if (savedFilters) { + return JSON.parse(savedFilters); + } else { + return []; + } +} + +/////////////////////////// +// INITIAL PAGE LOAD // +///////////////////////// + loadCartFromLocalStorage(); +renderFilterButtons(); renderProducts(); renderCart();