PageSourceSearch

https://elseda.ru/local/templates/elseda/js/cart.js?v=1.0.0

js elseda.ru collected 2026-10-04 19:23:09 UTC 4,836 bytes, 212 lines download raw bytes

1const TEMPLATE_PATH = "/local/templates/elseda";
2
3
4let cartQueue = Promise.resolve();
5let cartBusy = false;
6
7function setCartBusy(state) {
8  cartBusy = state;
9  $(".js-cart-modal").toggleClass("div--loading", state);
10  $(".js-cart-item-remove, .js-cart-quantity-minus, .js-cart-quantity-plus").prop(
11    "disabled",
12    state,
13  );
14}
15
16function updateCartCount() {
17  var container = $(".js-header-cart-count");
18  var summary = $(".js-cart-modal-summary");
19
20  if (container.length) {
21    container.empty().hide();
22
23    if (summary.length && summary.data("cart-quantity")) {
24      container.text(summary.data("cart-quantity")).show();
25    }
26  }
27}
28
29$(document).ready(() => {
30  updateCartCount();
31});
32
33$(document).on("click", ".js-add-to-cart", function (e) {
34  e.preventDefault();
35
36  var quantityField = $(this).closest("div").find(".js-add-to-cart-quantity");
37
38  addToCartData(
39    [
40      {
41        PRODUCT_ID: $(this).data("product-id"),
42        QUANTITY:
43          quantityField.length && quantityField.val()
44            ? parseInt(quantityField.val(), 10) || 1
45            : 1,
46      },
47    ],
48    "Товар добавлен в корзину",
49  );
50});
51
52$(document).on("click", ".js-cart-item-remove", function (e) {
53  e.preventDefault();
54  if (cartBusy) return;
55
56  var item = $(this).closest(".js-cart-item");
57  if (!item.length) return;
58
59  addToCartData([
60    {
61      BASKET_ID: item.data("id"),
62      PRODUCT_ID: item.data("product-id"),
63      QUANTITY: 0,
64    },
65  ]);
66});
67
68$(document).on("click", ".js-cart-quantity-minus", function (e) {
69  e.preventDefault();
70  if (cartBusy) return;
71
72  var input = $(this).next("input");
73  var item = $(this).closest(".js-cart-item");
74  if (!input.length || !item.length) return;
75
76  var quantity = parseInt(input.val(), 10) || 1;
77  if (quantity <= 1) return;
78
79  quantity--;
80  input.val(quantity);
81
82  addToCartData([
83    {
84      BASKET_ID: item.data("id"),
85      PRODUCT_ID: item.data("product-id"),
86      QUANTITY: quantity,
87    },
88  ]);
89});
90
91$(document).on("click", ".js-cart-quantity-plus", function (e) {
92  e.preventDefault();
93  if (cartBusy) return;
94
95  var input = $(this).prev("input");
96  var item = $(this).closest(".js-cart-item");
97  if (!input.length || !item.length) return;
98
99  var quantity = (parseInt(input.val(), 10) || 0) + 1;
100  input.val(quantity);
101
102  addToCartData([
103    {
104      BASKET_ID: item.data("id"),
105      PRODUCT_ID: item.data("product-id"),
106      QUANTITY: quantity,
107    },
108  ]);
109});
110
111function clearCartErrors() {}
112
113function showCartErrors() {}
114
115function updateCartModal() {
116  var basketClass = ".js-cart-modal";
117
118  if (!$(basketClass).length) {
119    return Promise.resolve();
120  }
121
122  $(basketClass).addClass("div--loading");
123
124  return new Promise(function (resolve) {
125    $.get(`${TEMPLATE_PATH}/ajax/basket.php`, function (response) {
126      var basketScroll = $(basketClass).find(".float-menu-body").scrollTop();
127
128      $(basketClass).replaceWith(function () {
129        return response;
130      });
131
132      $(basketClass).find(".float-menu-body").scrollTop(basketScroll);
133      updateCartCount();
134    })
135      .always(function () {
136        $(basketClass).removeClass("div--loading");
137        resolve();
138      });
139  });
140}
141
142
143function addToCartData(data, message) {
144  clearCartErrors();
145
146  cartQueue = cartQueue.then(function () {
147    setCartBusy(true);
148
149    return new Promise(function (resolve) {
150      $.post(`${TEMPLATE_PATH}/ajax/add-to-cart.php`, { ITEMS: data })
151        .done(function (response) {
152
153          if (response && response.desync && response.desync.length) {
154            updateCartModal().then(resolve);
155            return;
156          }
157
158          if (message) {
159            alert(message);
160          }
161
162          updateCartModal().then(resolve);
163        })
164        .fail(function (error) {
165          var payload = error && error.responseJSON;
166          var errorText = payload && payload.error;
167          var errorCode = payload && payload.error_code;
168          var errorSizes = payload && payload.error_size;
169
170
171          if (errorCode === "NOTHING_APPLIED" || errorCode === "BAD_SESSID") {
172            updateCartModal().then(resolve);
173            return;
174          }
175
176          if (errorText) {
177            alert(errorText);
178          }
179
180          showCartErrors(errorCode, errorSizes);
181          updateCartModal().then(resolve);
182        })
183        .always(function () {
184          setCartBusy(false);
185        });
186    });
187  });
188
189  return cartQueue;
190}
191
192window.digiLayer = {
193  cartState() {
194    return window.jsModalCartAnyQuery || {};
195  },
196  ddToCart(offer_id, amount) {
197    return addToCartData([
198      {
199        PRODUCT_ID: offer_id,
200        QUANTITY: amount,
201      },
202    ]).then(() => true);
203  },
204  removeFromCart(offer_id) {
205    return addToCartData([
206      {
207        PRODUCT_ID: offer_id,
208        QUANTITY: 0,
209      },
210    ]).then(() => true);
211  },
212};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.