diff --git a/components/likes/controller.js b/components/likes/controller.js index 9440d30..d07473d 100644 --- a/components/likes/controller.js +++ b/components/likes/controller.js @@ -25,6 +25,21 @@ export class LikesController { setupLikesEventListeners() { document.addEventListener('click', async (e) => { const likeItem = e.target.closest('.like-item'); + + // Обработка кнопки очистки всего избранного + if (e.target.closest('#clearAllLikesBtn')) { + if (confirm('Вы уверены, что хотите очистить всё избранное?')) { + try { + await this.model.clearAllLikes(); + this.view.showNotification('Все товары удалены из избранного'); + await this.loadLikes(); + } catch (error) { + this.view.showNotification('Ошибка при очистке избранного', 'error'); + } + } + return; + } + if (!likeItem) return; const productId = likeItem.dataset.id; @@ -91,4 +106,4 @@ export class LikesController { return null; } } -} +} \ No newline at end of file diff --git a/components/likes/model.js b/components/likes/model.js index 5b6e147..f89ba19 100644 --- a/components/likes/model.js +++ b/components/likes/model.js @@ -50,6 +50,19 @@ export class LikesModel { } } + async clearAllLikes() { + try { + const items = await this.getLikesItems(); + // Удаляем все товары из избранного + for (const item of items) { + await this.removeFromLikes(item.id); + } + } catch (error) { + console.error('Ошибка при очистке избранного:', error); + throw error; + } + } + async moveToBasket(product) { try { // 1. Добавляем в корзину @@ -66,4 +79,4 @@ export class LikesModel { console.error('Ошибка при переносе товара в корзину:', error); } } -} +} \ No newline at end of file diff --git a/components/likes/view.js b/components/likes/view.js index 9d4c53f..385b11e 100644 --- a/components/likes/view.js +++ b/components/likes/view.js @@ -18,9 +18,14 @@ export class LikesView { const likesHTML = items.map(item => this.createLikesItemHTML(item)).join(''); - // Добавляем заголовок "Избранное" и правильно структурируем сетку + // Добавляем заголовок "Избранное" и кнопку очистки this.likesContainer.innerHTML = ` -

Избранное

+
+

Избранное

+ +
${likesHTML}
diff --git a/db.json b/db.json index 65828a8..215988f 100644 --- a/db.json +++ b/db.json @@ -70,16 +70,6 @@ "name": "wu" } ], - "likes": [ - { - "id": "U3RvbmUg", - "name": "Stone Island", - "price": 1999.99, - "description": "super idol rovny pacan, groza rayona, mother's modnik, патч на месте", - "image": "http://127.0.0.1:4000/assets/stonik-D_cwcHTM.jpg", - "category": "men", - "condition": "new" - } - ], + "likes": [], "basket": [] } \ No newline at end of file diff --git a/dist/assets/controller-DJ63uLU_.js b/dist/assets/controller-DVj45vQ2.js similarity index 56% rename from dist/assets/controller-DJ63uLU_.js rename to dist/assets/controller-DVj45vQ2.js index 2f6f3f7..83f905b 100644 --- a/dist/assets/controller-DJ63uLU_.js +++ b/dist/assets/controller-DVj45vQ2.js @@ -1,5 +1,10 @@ -class h{constructor(){this.apiUrl="http://localhost:3000"}async request(t,e={}){const s=await fetch(`${this.apiUrl}${t}`,{...e,headers:{"Content-Type":"application/json",...e.headers}});if(!s.ok)throw new Error(`HTTP error! status: ${s.status}`);return await s.json()}async getLikesItems(){try{return await this.request("/likes")}catch(t){return console.error("Ошибка при получении избранного:",t),[]}}async addToLikes(t){try{if(!(await this.getLikesItems()).find(i=>i.id===t.id))return await(await fetch(`${this.apiUrl}/likes`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})).json()}catch(e){console.error("Ошибка при добавлении в избранное:",e)}}async removeFromLikes(t){try{await fetch(`${this.apiUrl}/likes/${t}`,{method:"DELETE"})}catch(e){console.error("Ошибка при удалении из избранного:",e)}}async moveToBasket(t){try{await(await fetch(`${this.apiUrl}/basket`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...t,quantity:1,addedAt:new Date().toISOString()})})).json(),await this.removeFromLikes(t.id)}catch(e){console.error("Ошибка при переносе товара в корзину:",e)}}}class m{constructor(){this.likesContainer=document.getElementById("likesContainer"),this.emptyLikesElement=document.querySelector(".empty-likes")}showLikes(t){if(!this.likesContainer)return;if(!t||t.length===0){this.showEmptyLikes();return}this.hideEmptyLikes();const e=t.map(s=>this.createLikesItemHTML(s)).join("");this.likesContainer.innerHTML=` -

Избранное

+class h{constructor(){this.apiUrl="http://localhost:3000"}async request(t,e={}){const s=await fetch(`${this.apiUrl}${t}`,{...e,headers:{"Content-Type":"application/json",...e.headers}});if(!s.ok)throw new Error(`HTTP error! status: ${s.status}`);return await s.json()}async getLikesItems(){try{return await this.request("/likes")}catch(t){return console.error("Ошибка при получении избранного:",t),[]}}async addToLikes(t){try{if(!(await this.getLikesItems()).find(i=>i.id===t.id))return await(await fetch(`${this.apiUrl}/likes`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})).json()}catch(e){console.error("Ошибка при добавлении в избранное:",e)}}async removeFromLikes(t){try{await fetch(`${this.apiUrl}/likes/${t}`,{method:"DELETE"})}catch(e){console.error("Ошибка при удалении из избранного:",e)}}async clearAllLikes(){try{const t=await this.getLikesItems();for(const e of t)await this.removeFromLikes(e.id)}catch(t){throw console.error("Ошибка при очистке избранного:",t),t}}async moveToBasket(t){try{await(await fetch(`${this.apiUrl}/basket`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...t,quantity:1,addedAt:new Date().toISOString()})})).json(),await this.removeFromLikes(t.id)}catch(e){console.error("Ошибка при переносе товара в корзину:",e)}}}class m{constructor(){this.likesContainer=document.getElementById("likesContainer"),this.emptyLikesElement=document.querySelector(".empty-likes")}showLikes(t){if(!this.likesContainer)return;if(!t||t.length===0){this.showEmptyLikes();return}this.hideEmptyLikes();const e=t.map(s=>this.createLikesItemHTML(s)).join("");this.likesContainer.innerHTML=` +
+

Избранное

+ +
${e}
@@ -45,4 +50,4 @@ class h{constructor(){this.apiUrl="http://localhost:3000"}async request(t,e={}){ `}showEmptyLikes(){this.emptyLikesElement&&(this.emptyLikesElement.style.display="block"),this.likesContainer&&(this.likesContainer.innerHTML="")}hideEmptyLikes(){this.emptyLikesElement&&(this.emptyLikesElement.style.display="none")}showNotification(t,e="success"){const s=document.createElement("div");s.className=`alert alert-${e==="success"?"success":"danger"} alert-dismissible fade show`,s.style.cssText="position: fixed; top: 20px; right: 20px; z-index: 1050; min-width: 300px;",s.innerHTML=` ${t} - `,document.body.appendChild(s),setTimeout(()=>{s.parentNode&&s.remove()},3e3)}}class p{constructor(t,e){this.model=t,this.view=e,this.init()}async init(){window.location.pathname.includes("likes.html")&&(await this.loadLikes(),this.setupLikesEventListeners()),window.location.pathname.includes("catalog.html")&&this.setupCatalogEventListeners()}async loadLikes(){const t=await this.model.getLikesItems();this.view.showLikes(t)}setupLikesEventListeners(){document.addEventListener("click",async t=>{const e=t.target.closest(".like-item");if(!e)return;const s=e.dataset.id;if(t.target.closest(".remove-like-btn")&&(await this.model.removeFromLikes(s),this.view.showNotification("Товар удален из избранного"),await this.loadLikes()),t.target.closest(".move-to-basket-btn")){const o=(await this.model.getLikesItems()).find(a=>a.id===s);o&&(await this.model.moveToBasket(o),this.view.showNotification("Товар перенесен в корзину"),await this.loadLikes())}})}setupCatalogEventListeners(){document.addEventListener("click",async t=>{const e=t.target.closest(".card");if(e&&t.target.closest(".like-btn")){const s=this.extractProductData(e);s&&(await this.model.addToLikes(s),this.view.showNotification("Товар добавлен в избранное!"))}})}extractProductData(t){var e,s;try{const i=t.querySelector(".card-title").textContent,o=t.querySelector(".text-muted").textContent.replace("$",""),a=t.querySelector(".card-text").textContent,r=t.querySelector("img").src,c=((e=t.querySelector(".col-6:nth-child(1) p"))==null?void 0:e.textContent.trim())||"",l=((s=t.querySelector(".col-6:nth-child(2) p"))==null?void 0:s.textContent.trim())||"";return{id:btoa(`${i}-${o}`).substring(0,8),name:i.trim(),price:parseFloat(o),description:a.trim(),image:r,category:c,condition:l}}catch(i){return console.error("Ошибка при извлечении данных товара:",i),null}}}export{m as L,p as a,h as b}; + `,document.body.appendChild(s),setTimeout(()=>{s.parentNode&&s.remove()},3e3)}}class p{constructor(t,e){this.model=t,this.view=e,this.init()}async init(){window.location.pathname.includes("likes.html")&&(await this.loadLikes(),this.setupLikesEventListeners()),window.location.pathname.includes("catalog.html")&&this.setupCatalogEventListeners()}async loadLikes(){const t=await this.model.getLikesItems();this.view.showLikes(t)}setupLikesEventListeners(){document.addEventListener("click",async t=>{const e=t.target.closest(".like-item");if(t.target.closest("#clearAllLikesBtn")){if(confirm("Вы уверены, что хотите очистить всё избранное?"))try{await this.model.clearAllLikes(),this.view.showNotification("Все товары удалены из избранного"),await this.loadLikes()}catch{this.view.showNotification("Ошибка при очистке избранного","error")}return}if(!e)return;const s=e.dataset.id;if(t.target.closest(".remove-like-btn")&&(await this.model.removeFromLikes(s),this.view.showNotification("Товар удален из избранного"),await this.loadLikes()),t.target.closest(".move-to-basket-btn")){const o=(await this.model.getLikesItems()).find(a=>a.id===s);o&&(await this.model.moveToBasket(o),this.view.showNotification("Товар перенесен в корзину"),await this.loadLikes())}})}setupCatalogEventListeners(){document.addEventListener("click",async t=>{const e=t.target.closest(".card");if(e&&t.target.closest(".like-btn")){const s=this.extractProductData(e);s&&(await this.model.addToLikes(s),this.view.showNotification("Товар добавлен в избранное!"))}})}extractProductData(t){var e,s;try{const i=t.querySelector(".card-title").textContent,o=t.querySelector(".text-muted").textContent.replace("$",""),a=t.querySelector(".card-text").textContent,r=t.querySelector("img").src,c=((e=t.querySelector(".col-6:nth-child(1) p"))==null?void 0:e.textContent.trim())||"",l=((s=t.querySelector(".col-6:nth-child(2) p"))==null?void 0:s.textContent.trim())||"";return{id:btoa(`${i}-${o}`).substring(0,8),name:i.trim(),price:parseFloat(o),description:a.trim(),image:r,category:c,condition:l}}catch(i){return console.error("Ошибка при извлечении данных товара:",i),null}}}export{m as L,p as a,h as b}; diff --git a/dist/assets/page2-C4zhLU5g.js b/dist/assets/page2-Bk9Tmp6W.js similarity index 87% rename from dist/assets/page2-C4zhLU5g.js rename to dist/assets/page2-Bk9Tmp6W.js index 16f8fa9..29b4838 100644 --- a/dist/assets/page2-C4zhLU5g.js +++ b/dist/assets/page2-Bk9Tmp6W.js @@ -1 +1 @@ -import"./modulepreload-polyfill-B5Qt9EMX.js";/* empty css */import{L as t,a as o,b as d}from"./controller-DJ63uLU_.js";import{V as i,C as s,M as r}from"./controller-BHzoImTo.js";document.addEventListener("DOMContentLoaded",function(){if(document.getElementById("productsContainer")){const e=new d,n=new t;new o(e,n)}});document.addEventListener("DOMContentLoaded",function(){if(document.getElementById("basketContainer")||document.getElementById("productsContainer")){const e=new r,n=new i;new s(e,n)}}); +import"./modulepreload-polyfill-B5Qt9EMX.js";/* empty css */import{L as t,a as o,b as d}from"./controller-DVj45vQ2.js";import{V as i,C as s,M as r}from"./controller-BHzoImTo.js";document.addEventListener("DOMContentLoaded",function(){if(document.getElementById("productsContainer")){const e=new d,n=new t;new o(e,n)}});document.addEventListener("DOMContentLoaded",function(){if(document.getElementById("basketContainer")||document.getElementById("productsContainer")){const e=new r,n=new i;new s(e,n)}}); diff --git a/dist/assets/page4-Cjnio00W.js b/dist/assets/page4-DL921iBt.js similarity index 76% rename from dist/assets/page4-Cjnio00W.js rename to dist/assets/page4-DL921iBt.js index be17215..ba832dc 100644 --- a/dist/assets/page4-Cjnio00W.js +++ b/dist/assets/page4-DL921iBt.js @@ -1 +1 @@ -import"./modulepreload-polyfill-B5Qt9EMX.js";/* empty css */import{L as o,a as t,b as i}from"./controller-DJ63uLU_.js";document.addEventListener("DOMContentLoaded",function(){if(document.getElementById("likesContainer")){const e=new i,n=new o;new t(e,n)}}); +import"./modulepreload-polyfill-B5Qt9EMX.js";/* empty css */import{L as o,a as t,b as i}from"./controller-DVj45vQ2.js";document.addEventListener("DOMContentLoaded",function(){if(document.getElementById("likesContainer")){const e=new i,n=new o;new t(e,n)}}); diff --git a/dist/catalog.html b/dist/catalog.html index 8a9a81b..1f13d0c 100644 --- a/dist/catalog.html +++ b/dist/catalog.html @@ -70,9 +70,9 @@ transition: text-shadow 0.2s ease; } - + - + diff --git a/dist/likes.html b/dist/likes.html index cdf35dc..d032a3a 100644 --- a/dist/likes.html +++ b/dist/likes.html @@ -7,9 +7,9 @@ - + - +