Stock por sucursal en tablas - Bsale-IO/template-docs GitHub Wiki
Codigo Sucursal > tabla stock 🟢
{% assign showAsAccordion = true %} <!-- Cambiar a false para mostrar solo la tabla -->
{% if product.classification != 1 %}
{% capture stock %}
"0": "<span style='color: red;'>Agotado</span>",
"full": "{cantidad}",
"table": true,
"tableTitle": ["sucursal", "stock"]
{% endcapture %}
{% if showAsAccordion %}
<!-- Acordeón con botón desplegable -->
<div class="stock-accordion" id="stockAccordion">
<div class="stock-card">
<div class="stock-card-header d-flex align-items-center justify-content-between" id="headingStock">
<h5 class="mb-0 stock-accordion-title">
Stock por Sucursales
</h5>
<button class="stock-accordion-btn" type="button" data-toggle="collapse" data-target="#collapseStock" aria-expanded="false" aria-controls="collapseStock" onclick="toggleIcon(this)">
<span class="stock-toggle-icon">+</span> <!-- Icono de apertura -->
</button>
</div>
<div id="collapseStock" class="collapse" aria-labelledby="headingStock" data-parent="#stockAccordion">
<div class="stock-card-body">
<div class="bs-table-sucursal-accordion" data-bs="product.stock.detail" data-info='{ {{stock | replace: "'", '\"'}} }'>
</div>
</div>
</div>
</div>
</div>
{% else %}
<!-- Tabla sin el acordeón -->
<div class="bs-table-sucursal-static" data-bs="product.stock.detail" data-info='{ {{stock | replace: "'", '\"'}} }'>
</div>
{% endif %}
{% endif %}
<script>
function toggleIcon(button) {
const icon = button.querySelector('.stock-toggle-icon');
if (icon.textContent === '+') {
icon.textContent = '-';
} else {
icon.textContent = '+';
}
}
</script>
Codigo CSS Sucursal > tabla stock 🟢
/******************
Sucursales tabla
*******************/
/* Estilos para la tabla estática */
.bs-table-sucursal-static table {
width: 100%;
max-width: 800px;
margin: 20px auto;
border-collapse: separate;
border-spacing: 0;
font-size: 14px;
text-align: left;
background-color: #ffffff;
border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
}
/* Estilos para la tabla en el acordeón */
.bs-table-sucursal-accordion table {
width: 100%;
margin: 1px auto;
border-collapse: separate;
border-spacing: 0;
font-size: 14px;
text-align: left;
background-color: #ffffff;
border: 1px solid rgb(248 249 250);
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
/* Encabezado de la tabla */
.bs-table-sucursal-static thead, .bs-table-sucursal-accordion thead {
background-color: #f8f9fa;
color: #333;
}
.bs-table-sucursal-static th, .bs-table-sucursal-accordion th {
padding: 6px;
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
text-transform: capitalize;
font-weight: bold;
}
/* Filas de la tabla */
.bs-table-sucursal-static td, .bs-table-sucursal-accordion td {
padding: 12px;
border-bottom: 1px solid rgba(0, 0, 0, 0.05); /* Borde sutil */
}
.bs-table-sucursal-static tbody tr:last-child td, .bs-table-sucursal-accordion tbody tr:last-child td {
border-bottom: none;
}
.bs-table-sucursal-static tbody tr:hover, .bs-table-sucursal-accordion tbody tr:hover {
background-color: #f5f5f5; /* Efecto hover */
transition: background-color 0.3s ease;
}
/* Estilos para el acordeón */
.stock-accordion .stock-card {
border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: 7px;
margin: 8px 0;
width: 70%;
}
.stock-card-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 15px;
background-color: #f8f9fa;
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
font-weight: bold;
color: #333;
}
.stock-accordion-title {
margin: 0;
font-size: 16px;
font-weight: bold;
}
.stock-accordion-btn {
background-color: var(--primary-color);
border: 2px solid var(--primary-color);
border-radius: 50%;
color: var(--primary-contrast);
font-size: 18px;
cursor: pointer;
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s ease;
}
.stock-accordion-btn:hover {
background-color: var(--primary-hover-color);
border-color: var(--primary-hover-color);
color: white;
}
.stock-toggle-icon {
font-size: 18px;
}
.collapse.show + .stock-card-header .stock-accordion-btn .stock-toggle-icon {
content: "-";
}
.stock-card-body {
flex: 1 1 auto;
min-height: 1px;
padding: 0px;
}
.stock-accordion-body {
padding: 10px 20px;
font-size: 14px;
background-color: #ffffff;
color: #333;
}
El componente Modal esta incorporado en todos los template base, sin embargo para poder activarlo, se deberá modificar la variable configuración del componente del Producto > detalle en el componente
{{'Producto > detalle '| get_component }}
Para a activar dejar en true variable show_sucursal_table
{% assign show_sucursal_table = false %} <!-- Configuración: Cambia a true y muestra tablas de sucursales -->
El componente incluye una variable de configuración que permite definir su presentación. Las opciones disponibles son: mostrarlo como un acordeón o en una tabla estática:
{% assign showAsAccordion = true %} <!-- Cambiar a false para mostrar solo la tabla -->
Important
Si la plantilla usada no tiene la tabla, hay crear el componente Sucursal > tabla stock con su css y editar el componente Producto > detalle
Codigo Sucursal > tabla stock 🟢
{% assign showAsAccordion = true %} <!-- Cambiar a false para mostrar solo la tabla -->
{% if product.classification != 1 %}
{% capture stock %}
"0": "<span style='color: red;'>Agotado</span>",
"full": "{cantidad}",
"table": true,
"tableTitle": ["sucursal", "stock"]
{% endcapture %}
{% if showAsAccordion %}
<!-- Acordeón con botón desplegable -->
<div class="stock-accordion" id="stockAccordion">
<div class="stock-card">
<div class="stock-card-header d-flex align-items-center justify-content-between" id="headingStock">
<h5 class="mb-0 stock-accordion-title">
Stock por Sucursales
</h5>
<button class="stock-accordion-btn" type="button" data-toggle="collapse" data-target="#collapseStock" aria-expanded="false" aria-controls="collapseStock" onclick="toggleIcon(this)">
<span class="stock-toggle-icon">+</span> <!-- Icono de apertura -->
</button>
</div>
<div id="collapseStock" class="collapse" aria-labelledby="headingStock" data-parent="#stockAccordion">
<div class="stock-card-body">
<div class="bs-table-sucursal-accordion" data-bs="product.stock.detail" data-info='{ {{stock | replace: "'", '\"'}} }'>
</div>
</div>
</div>
</div>
</div>
{% else %}
<!-- Tabla sin el acordeón -->
<div class="bs-table-sucursal-static" data-bs="product.stock.detail" data-info='{ {{stock | replace: "'", '\"'}} }'>
</div>
{% endif %}
{% endif %}
<script>
function toggleIcon(button) {
const icon = button.querySelector('.stock-toggle-icon');
if (icon.textContent === '+') {
icon.textContent = '-';
} else {
icon.textContent = '+';
}
}
</script>
Codigo Producto > detalle actualizado 🟢
{% assign show_sucursal_table = false %} <!-- Configuración: Cambia a true y muestra tablas de sucursales -->
<article class="mt-3" data-bs="product.detail">
<h1 class="bs-product__title">{{title}} <small class="bs-product__title-notice">{{product.notice}}</small></h1>
<div class="bs-product__sku" data-bs="product.sku">{{product.sku}}</div>
<!------- marca -------------->
{% if product.brand and product.brand.name != "" %}
{% if product.brand.logoImg %}
<a href="{{product.brand.link}}" title="{{product.brand.name}}">
<img class="fluid-img" src="{{product.brand.logoImg | image_url: "T"}}"
title="{{product.brand.name}}"
alt="{{product.brand.name}}">
</a>
{% elsif product.brand.link %}
<a class="btn btn-light" href="{{product.brand.link}}" title="{{product.brand.name}}">
{{product.brand.name}}
</a>
{% endif %}
{% endif %}
<!----------- stock ---------------------->
{% if show_sucursal_table %}
{{ 'Sucursal > tabla stock' | get_component }}
{% else %}
{{ 'Sucursal > stock ' | get_component }}
{{ 'Producto > detalle > stock' | get_component }}
{% endif %}
<!-----------------price -------------------->
{{'Producto > detalle > precio' | get_component }}
<!------------------------form add to cart ------------------------------------------>
<div class="row align-items-end" id="bs-product-form">
<div class="col-12">
{{ 'Producto > detalle > atributos' | get_component }}
<!---------------- select ------------------------>
</div>
<!------------------ cantidad ----------------------------->
<div class="col-12 col-md-6 form-group">
<label class="bs-product__label">cantidad</label>
<div class="input-group">
<div class="input-group-prepend">
<button data-bs="product.quantity.minus" class="btn btn-secondary">
<i class="fas fa-minus"></i>
</button>
</div>
<input data-bs="product.quantity" class="form-control text-center " value="1" min="1">
<div class="input-group-append">
<button data-bs="product.quantity.plus" class="btn btn-secondary">
<i class="fas fa-plus"></i>
</button>
</div>
</div>
</div>
<!-------------------- add to cart ------------------------>
<div class="col-md-6 form-group ">
<button class="btn btn-primary w-100 d-none" data-bs="cart.add">
Agregar al carro
</button>
<button class="btn btn-danger w-100 d-none" data-bs="product.order">
Avísame cuando llegue
</button>
</div>
</div>
<section class="bs-product-description">
{{product.description}}
</section>
{{'redes sociales > compartir' | get_component }}
</article>
Codigo CSS Sucursal > tabla stock 🟢
/******************
Sucursales tabla
*******************/
/* Estilos para la tabla estática */
.bs-table-sucursal-static table {
width: 100%;
max-width: 800px;
margin: 20px auto;
border-collapse: separate;
border-spacing: 0;
font-size: 14px;
text-align: left;
background-color: #ffffff;
border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
}
/* Estilos para la tabla en el acordeón */
.bs-table-sucursal-accordion table {
width: 100%;
margin: 1px auto;
border-collapse: separate;
border-spacing: 0;
font-size: 14px;
text-align: left;
background-color: #ffffff;
border: 1px solid rgb(248 249 250);
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
/* Encabezado de la tabla */
.bs-table-sucursal-static thead, .bs-table-sucursal-accordion thead {
background-color: #f8f9fa;
color: #333;
}
.bs-table-sucursal-static th, .bs-table-sucursal-accordion th {
padding: 6px;
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
text-transform: capitalize;
font-weight: bold;
}
/* Filas de la tabla */
.bs-table-sucursal-static td, .bs-table-sucursal-accordion td {
padding: 12px;
border-bottom: 1px solid rgba(0, 0, 0, 0.05); /* Borde sutil */
}
.bs-table-sucursal-static tbody tr:last-child td, .bs-table-sucursal-accordion tbody tr:last-child td {
border-bottom: none;
}
.bs-table-sucursal-static tbody tr:hover, .bs-table-sucursal-accordion tbody tr:hover {
background-color: #f5f5f5; /* Efecto hover */
transition: background-color 0.3s ease;
}
/* Estilos para el acordeón */
.stock-accordion .stock-card {
border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: 7px;
margin: 8px 0;
width: 70%;
}
.stock-card-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 15px;
background-color: #f8f9fa;
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
font-weight: bold;
color: #333;
}
.stock-accordion-title {
margin: 0;
font-size: 16px;
font-weight: bold;
}
.stock-accordion-btn {
background-color: var(--primary-color);
border: 2px solid var(--primary-color);
border-radius: 50%;
color: var(--primary-contrast);
font-size: 18px;
cursor: pointer;
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s ease;
}
.stock-accordion-btn:hover {
background-color: var(--primary-hover-color);
border-color: var(--primary-hover-color);
color: white;
}
.stock-toggle-icon {
font-size: 18px;
}
.collapse.show + .stock-card-header .stock-accordion-btn .stock-toggle-icon {
content: "-";
}
.stock-card-body {
flex: 1 1 auto;
min-height: 1px;
padding: 0px;
}
.stock-accordion-body {
padding: 10px 20px;
font-size: 14px;
background-color: #ffffff;
color: #333;
}