Our Partner & Developer boards on the community are moving to a brand new home: the .dev community forums! While you can still access past discussions here, for all your future app and storefront building questions, head over to the new forums.

cart drawer quantity

cart drawer quantity

solcabz
Shopify Partner
5 0 1
hi i create a custom cart drawer and i create a increase decrease for the quantity, the value of the input is changeing but not permanently ant the total value im stock what wrong im doing.
<form action="{{ routes.cart_url }}" method="post">
  <div class="cart-items">
    {% if cart.empty? %}
    <div class="empty-cart">
      <p>cart is empty</p>
    </div>
    {% else %}
    {% for item in cart.items %}
    <div class="cart-item">
      <!-- line item info -->
      <img width="200" height="200" loading="lazy" src="{{ item.image | image_url}}">

      <div class="cart-info-wrapper">
        <div class="info-cart-top">
          <div>
            <h2>{{ item.title }}</h2>
            <p>{{ item.final_line_price | money }}</p>
          </div>
          <div>
            <a href="{{ item.url_to_remove }}" aria-label="Remove item from cart">
              <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256">
                <path d="M165.66,101.66,139.31,128l26.35,26.34a8,8,0,0,1-11.32,11.32L128,139.31l-26.34,26.35a8,8,0,0,1-11.32-11.32L116.69,128,90.34,101.66a8,8,0,0,1,11.32-11.32L128,116.69l26.34-26.35a8,8,0,0,1,11.32,11.32ZM232,128A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"></path>
              </svg>
            </a>
          </div>
        </div>
        <div class="info-cart-bottom">
          <div class="counter">
            <span class="down" aria-label="Decrease quantity" onClick='decreaseCount(event, this)'>-</span>
            <input type="text" name="updates[]" aria-label="Item quantity" value="{{item.quantity }}">
            <span class="up" aria-label="Increase quantity" onClick='increaseCount(event, this)'>+</span>
          </div>
        </div>
      </div>
    </div>
    {% endfor %}
    {% endif %}
  </div>

  <div class="checkout-wrapper">
    <p>Total: {{ cart.total_price | money }}</p>
    <a href="/checkout" class="checkoutBtn">Checkout </a>
  </div>

</form>

<style>
form {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  align-items: center;
  width: 100%;
  height: 90%;
  /* Make sure the form takes up the full height of the section */
}

.cart-items {
  display: flex;
  flex-direction: column;
  gap: 15px;
  padding: 10px 0;
  /* Space for the button */
  width: 100%;
  overflow-y: scroll;
}

.cart-item {
  display: flex;
  justify-content: start;
  gap: 10px;

}

.cart-item a {
  color: #ff0000;
  /* Red color for the remove link */
  text-decoration: none;
}

.cart-item img {
  border: 1px solid #2b2b2b;
  border-radius: 35px;
}

.cart-item a:hover {
  text-decoration: underline;
}

.checkoutBtn {
  background: {
      {
      section.settings.btn_bg
    }
  }

  ;

  color: {
      {
      section.settings.btn_color
    }
  }

  ;
  text-align: center;
  width: 100%;
  padding: 10px 0;
  border: none;
  border-radius: 8px;
  cursor: pointer;
  text-decoration: none !important;
  font-size: 16px;
  /* Increased font size for better readability */
}

input:hover {
  background: {
      {
      section.settings.btn_hover
    }
  }

  ;
}

.cart-info-wrapper {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  width: 100%;
}

.info-cart-top {
  display: flex;
  align-items: top;
  width: 100%;
  justify-content: space-between;
}

.info-cart-bottom {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
  height: 100px;
}

.counter {
  display: flex;
  justify-content: space-around;
  width: 100%;
  align-items: center;
  border: 1px solid #2b2b2b;
  border-radius: 35px;
  padding: 8px 0;
}

.counter input {
  background: #f1f1f1;
  text-align: center;
  outline: none;
  border: none;
  width: 35px;
}

.down,
.up {
  font-size: 22px;
  font-weight: bold;
  cursor: pointer;
}

.checkout-wrapper {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  width: 100%;
}

.info-cart-top h2 {
  margin: 0;
}

</style>


<script>
  function increaseCount(a, b) {
  var input = b.previousElementSibling;
  var value = parseInt(input.value, 10);
  value = isNaN(value) ? 1 : value; // Ensure at least 1
  value++;
  input.value = value;
  }

  function decreaseCount(a, b) {
  var input = b.nextElementSibling;
  var value = parseInt(input.value, 10);
  value = isNaN(value) ? 1 : value; // Ensure at least 1
  value = value > 1 ? value - 1 : 1; // Prevent value from going below 1
  input.value = value;
  }
</script>
Reply 1 (1)

solcabz
Shopify Partner
5 0 1

i did some change on the js like this but im recieving a 422 error

// Update Quantity Function
function updateQuantity(line, quantity) {
  $.ajax({
    type: "POST",
    url: "/cart/change.js",
    data: {
      line: line, // Should be the line item index, not a variant ID
      quantity: quantity, // New quantity value
    },
    dataType: "json", // Parse response as JSON
    success: function (response) {
      console.log("success change");
    },
    error: function (xhr, status, error) {
      console.error("Error:", xhr.responseText, status, error);
    },
  });
}

// Quantity Selector Change Handlers
$(document).ready(function () {
  $(document).on("click", ".up, .down", function () {
    var $input = $(this).siblings("input"); // Get the input field
    var currentVal = parseInt($input.val(), 10);
    var newVal = $(this).hasClass("up")
      ? currentVal + 1
      : Math.max(0, currentVal - 1);

    $input.val(newVal);

    // Get the line item index directly from the data-line attribute
    var line = $(this).data("line");
    var quantity = $input.val();

    // Call the updateQuantity function with the correct line and quantity
    updateQuantity(line, quantity);

    // Optionally update cart display
    var formData = $(this).closest("form").serialize();
    $.ajax({
      type: "POST",
      url: "/cart/update",
      data: formData,
      dataType: "html",
      success: function (response) {
        // Replace cart HTML with the updated cart
        $(".cart__drawer").html($(response).find(".cart__drawer").html());
      },
      error: function (xhr, status, error) {
        console.error("AJAX Error:", status, error);
        alert("Failed to update cart. Please try again.");
      },
    });
  });
});