Custom Cart - Bsale-IO/template-docs GitHub Wiki

Componente inicial:

Componente que itera los items del carrito y se utiliza para personalizar el carro desplegable.

  • component: Objeto que contiene datos generales del componente como el nombre
  • cartItems: Arreglo de items del carrito
  • item: Item del carrito
  • component.name: Nombre del componente

Nuevo filtro

El nuevo filtro 'get_cart_component' esta especialmente diseñado para ser utilizado para obtener este tipo de componente, sin embargo, igual es posible llamarlos mediante el componente normal 'get_component'.

<div class="container">
   {{ 'Carro desplegable' | get_cart_component }}
</div>

Contenido

<!-- ícono y textos en caso de que el carro esté vacío -->
{% assign iconCart = '<i class="fas fa-shopping-cart"></i>' %}
{% assign txtCartEmpty  = 'Tu carro está vacío :c' %}

<style>

/*****************************************************/
/* Estilos para el carro desplegable  */
/*****************************************************/

.general_container {
  display: flex;
  max-width: calc(100% - 24em);
}

.container_header_main {
  width: 100%;
}

.cart_container {
  position: sticky;
  bottom:0;
  min-width: 24em;
  background-color: white;
}

.cart_dropdown {
  position: sticky;
  bottom: 0;
  top: 12%;
  right: 10.5px;
  width: 22.5em;
  height: 85vh;
  display: flex;
  border: 1px solid dimgray;
  border-radius: 0.5em;
  margin: 0rem auto;
  flex-direction: column;
  justify-content: center;
  transition: top bottom 0.4s;
}

.cart_dropdown_no_follow {
  position: absolute;
  top: auto;
  left: 5px;
  right: 5px;
  bottom: 10px;
}
 
.quantityButtons {
    display: flex;
    width: 100%;
    justify-content: space-between;
}

.quantityButtons > div:nth-child(1) {
    width: 60%;
}

button[data-bs="btnCloseDropdown"] {
    display: none;
}
 
@media screen and (max-width: 830px) {
    .general_container {
        max-width: 100%;
    }
    .cart_container {
        width: 0em;
        min-width: 0em;
    }
    .cart_dropdown {
        right: initial;
        top: initial;
        left: 0;
        width: 100%;
    }
    .cart_dropdown {
      position: fixed;
      bottom: 0;
      top: initial;
      right: 0px;
      width: 95%;
      height: 50vh;
      flex-direction: column;
      justify-content: center;
      transition: top bottom 0.4s;
    }
    .containerItemCart {
      display: flex;
      justify-content: space-between;
      max-height: 50vh;
      height: 8em;
      margin: 1.1rem 0;
    }
    .detailItemCart {
        margin-bottom: 0em;
    }
    .quantityButtons {
        position: relative;
        width: 45%;
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
    }
    .quantityButtons > div:nth-child(1) {
        width: 100%;
    }
    button[data-bs="btnCloseDropdown"] {
        display: initial;
    }
    .containerItemsCart .cart__item {
        border-bottom: 1px solid rgba(0, 0, 0, 0.2);
        margin-bottom: 1.5em;
    }
    .containerItemsCart .cart__item:last-child() {
        border-bottom: none;
        margin-bottom: 0em;
    }
    .btn_cart_remove {
        position: absolute;
        top: -15px;
        right: 0px;
        border-radius: 50%;
        background-color: transparent;
        color: #2f9001;
    }
}

</style>

<!-- CAMBIAR ctName por component.name-->
<div id="cart_dropdown" data-bs="cart.dropdown" class="dropdownContent cart_dropdown" data-component-name="{{ component.name }}">
    <!-- Carrito vacío -->
    <div id="containerCartEmpty" data-bs="cart.empty" class="containerCartEmpty d-none">
      <i class="fas fa-shopping-cart"></i>
      <p>{{ txtCartEmpty }}</p>
      <button data-bs="btnCloseDropdown" class="btn btn-primary mx-1 w-50">Cerrar</button>
    </div>
    
    <!-- Template para el dibujado de los items del carrito -->
    <div data-bs="containerItemsCart" class="containerItemsCart">
        {% for item in cartItems %}
            <!-- Section (creado para cada item) -->
            <section class="cart__item" data-bs="cart.item" data-info="{{ item.id }}" data-cart-item="cart_item">
                <div class="containerItemCart fadeIn">
                  <div class="detailItemCart">
                    <div class="bs-img-square">
                      <div data-bs="cart.item.discount" class="bs-discount tag d-none">
                          <strong data-bs="cart.item.discount.value">
                            -{{ item.discount }}%
                          </strong>
                      </div>
                      <picture>
                          <img src="{{ item.image }}" alt="{{ item.name }}" title="{{ item.name }}">
                      </picture>
                    </div>
                
                    <div class="infoItemCart">
                      <a href="{{ item.link }}" title="{{ item.name }}">
                        {{ item.name }}
                      </a>
                      <span class="textPriceUnity">Precio unidad</span>
                      <strike data-bs="cart.item.oldPrice">
                        {{ item.price | money_filter }}
                      </strike>
                      <div data-bs="cart.item.unitPrice">
                        {{ item.finalPrice | money_filter }}
                      </div>
                        <div data-bs="cart.stock.msg" class="d-none"></div>
                        </div>
                    </div>
                  
                  <div class="quantityButtons">
                      <div class="input-group">
                        <div class="input-group-prepend">
                          <button data-bs="cart.quantity.minus" class="btn btn-secondary">
                            <i class="fas fa-minus"></i>
                          </button>
                        </div>
                        <input data-bs="cart.quantity" class="form-control text-center" type="number" value="{{ item.quantity | round }}" min="1">
                        <div class="input-group-append ">
                          <button data-bs="cart.quantity.plus" class="btn btn-secondary">
                            <i class="fas fa-plus"></i>
                          </button>
                        </div>
                      </div>
                      <button type="button" data-bs="cart.remove" data-info="" class="btn btn-secondary btn_cart_remove">
                        <i class="fas fa-trash-alt"></i>
                      </button>
                  </div>
                </div>
            </section>
        {% endfor %}
    </div>
    
    <!-- Resumen del carrito -->
    <div id="footerDropdownCart" data-bs="cart.filled" class="footerDropdownCart"> 
        <hr>
        <div class="containerSubtotal">
          <h5>
            Subtotal: <span data-bs='cart.subtotal'>{{ cart.total  }}</span>
          </h5>
        </div>
    
        <div class="d-none">
          <button data-bs="cart.keepbuying" class="btn btn-primary" title="Seguir Comprando">Seguir comprando</button>
        </div>
    
        
        <div class="containerButtonGoToPay">
          <button type="button" data-bs="btnCloseDropdown" class="btn btn-secondary mx-1">Cerrar</button>
          <a data-bs="cart.continue" href="/cart/display/" class="btn btn-primary mx-1"> Continuar <i class="fas fa-arrow-right"></i></a>
        </div>
    </div>
</div>
⚠️ **GitHub.com Fallback** ⚠️