@@ -141,7 +241,15 @@
-
+
+
+
+
+
Stone Island
@@ -150,17 +258,17 @@Category:
-men
+men
Condition:
-new
+new
- $1999.99
+ $1999.99
@@ -179,7 +287,15 @@
-
+
+
+
+
+
Adidas
@@ -188,17 +304,17 @@Category:
-men
+men
Condition:
-wu
+wu
- $19.99
+ $19.99
@@ -217,7 +333,15 @@
-
+
+
+
+
+
Napapisaj
@@ -226,17 +350,17 @@Category:
-men
+men
Condition:
-wu
+wu
- $1499.99
+ $1499.99
@@ -255,7 +379,15 @@
-
+
+
+
+
+
Lacoste
@@ -264,17 +396,17 @@Category:
-uni
+uni
Condition:
-wu
+wu
- $399.99
+ $399.99
@@ -293,7 +425,15 @@
+ `}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};
diff --git a/dist/assets/page2-Crmhwurg.js b/dist/assets/page2-C4zhLU5g.js
similarity index 87%
rename from dist/assets/page2-Crmhwurg.js
rename to dist/assets/page2-C4zhLU5g.js
index 40f9bf5..16f8fa9 100644
--- a/dist/assets/page2-Crmhwurg.js
+++ b/dist/assets/page2-C4zhLU5g.js
@@ -1 +1 @@
-import"./modulepreload-polyfill-B5Qt9EMX.js";/* empty css */import{L as t,a as o,b as d}from"./controller-BsNF2rMP.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-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)}});
diff --git a/dist/assets/page4-DyyBeFxE.js b/dist/assets/page4-Cjnio00W.js
similarity index 76%
rename from dist/assets/page4-DyyBeFxE.js
rename to dist/assets/page4-Cjnio00W.js
index 4399df8..be17215 100644
--- a/dist/assets/page4-DyyBeFxE.js
+++ b/dist/assets/page4-Cjnio00W.js
@@ -1 +1 @@
-import"./modulepreload-polyfill-B5Qt9EMX.js";/* empty css */import{L as o,a as t,b as i}from"./controller-BsNF2rMP.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-DJ63uLU_.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 ce0f611..8a9a81b 100644
--- a/dist/catalog.html
+++ b/dist/catalog.html
@@ -8,27 +8,71 @@
-
+
-
+
@@ -81,6 +125,62 @@
}
+
+
-
+
+
- `}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=`
+
+
+
+ `;
+ }
showEmptyLikes() {
if (this.emptyLikesElement) {
@@ -96,4 +98,4 @@ export class LikesView {
if (notification.parentNode) notification.remove();
}, 3000);
}
-}
+}
\ No newline at end of file
diff --git a/db.json b/db.json
index 215988f..65828a8 100644
--- a/db.json
+++ b/db.json
@@ -70,6 +70,16 @@
"name": "wu"
}
],
- "likes": [],
+ "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"
+ }
+ ],
"basket": []
}
\ No newline at end of file
diff --git a/dist/assets/controller-BsNF2rMP.js b/dist/assets/controller-DJ63uLU_.js
similarity index 89%
rename from dist/assets/controller-BsNF2rMP.js
rename to dist/assets/controller-DJ63uLU_.js
index 74bcce7..2f6f3f7 100644
--- a/dist/assets/controller-BsNF2rMP.js
+++ b/dist/assets/controller-DJ63uLU_.js
@@ -1,6 +1,8 @@
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=`
+
+
+
Samba
@@ -302,17 +442,17 @@Category:
-women
+women
Condition:
-new
+new
- $449.99
+ $449.99
@@ -360,6 +500,112 @@
diff --git a/components/likes/controller.js b/components/likes/controller.js
index f784d60..9440d30 100644
--- a/components/likes/controller.js
+++ b/components/likes/controller.js
@@ -71,7 +71,7 @@ export class LikesController {
const description = card.querySelector('.card-text').textContent;
const image = card.querySelector('img').src;
- // ✅ Вытаскиваем category и condition
+ //Вытаскиваем category и condition
const category = card.querySelector('.col-6:nth-child(1) p')?.textContent.trim() || '';
const condition = card.querySelector('.col-6:nth-child(2) p')?.textContent.trim() || '';
diff --git a/components/likes/view.js b/components/likes/view.js
index 5e8eff7..9d4c53f 100644
--- a/components/likes/view.js
+++ b/components/likes/view.js
@@ -13,20 +13,22 @@ export class LikesView {
return;
}
- // 👉 Если товары есть — убираем блок "пусто"
+ // Если товары есть — убираем блок "пусто"
this.hideEmptyLikes();
const likesHTML = items.map(item => this.createLikesItemHTML(item)).join('');
- // 👉 Добавляем заголовок "Избранное"
+ // Добавляем заголовок "Избранное" и правильно структурируем сетку
this.likesContainer.innerHTML = `
@@ -34,7 +36,7 @@ export class LikesView {
-
-
- `;
-}
+ Избранное
-${likesHTML}
+
+ ${likesHTML}
+
`;
}
createLikesItemHTML(item) {
- return `
+ return `
${item.name}
${item.description}
- +Category:
@@ -45,8 +47,6 @@ export class LikesView {${item.condition || '-'}
@@ -65,8 +65,10 @@ export class LikesView {
Избранное
-${e}
+
+ ${e}
+
`}createLikesItemHTML(t){return`
@@ -9,7 +11,7 @@ class h{constructor(){this.apiUrl="http://localhost:3000"}async request(t,e={}){
-
-
${t.name}
${t.description}
- +Category:
@@ -20,8 +22,6 @@ class h{constructor(){this.apiUrl="http://localhost:3000"}async request(t,e={}){${t.condition||"-"}
@@ -40,7 +40,9 @@ class h{constructor(){this.apiUrl="http://localhost:3000"}async request(t,e={}){
+
+
+
+
+
+
+
+ Редактировать товар
+ +
+
+
+
+
+
+
+
@@ -145,7 +245,15 @@
-
+
+
+
+
+
Stone Island
@@ -154,17 +262,17 @@Category:
-men
+men
Condition:
-new
+new
- $1999.99
+ $1999.99
@@ -183,7 +291,15 @@
-
+
+
+
+
+
Adidas
@@ -192,17 +308,17 @@Category:
-men
+men
Condition:
-wu
+wu
- $19.99
+ $19.99
@@ -221,7 +337,15 @@
-
+
+
+
+
+
Napapisaj
@@ -230,17 +354,17 @@Category:
-men
+men
Condition:
-wu
+wu
- $1499.99
+ $1499.99
@@ -259,7 +383,15 @@
-
+
+
+
+
+
Lacoste
@@ -268,17 +400,17 @@Category:
-uni
+uni
Condition:
-wu
+wu
- $399.99
+ $399.99
@@ -297,7 +429,15 @@
-
+
+
+
+
+
Samba
@@ -306,17 +446,17 @@Category:
-women
+women
Condition:
-new
+new
- $449.99
+ $449.99
@@ -364,6 +504,112 @@
diff --git a/dist/likes.html b/dist/likes.html
index b4d9105..cdf35dc 100644
--- a/dist/likes.html
+++ b/dist/likes.html
@@ -7,9 +7,9 @@
-
+
-
+