trabajando en el resumen de cubierta

This commit is contained in:
Jaime Jiménez
2025-08-31 22:06:50 +02:00
parent 6b883ffab2
commit ea1c485c80
9 changed files with 239 additions and 55 deletions

View File

@ -1 +1,3 @@
app.currency-symbol=
app.currency-symbol=
app.yes=
app.no=No

View File

@ -29,17 +29,22 @@ presupuesto.paginas-posicion=Posición páginas color
presupuesto.paginas-posicion-descripcion=Intruzca la posición separada por comas. Ej: 3,5,7 ó 4-10,20,155
presupuesto.siempre-pares=Siempre deben ser pares
presupuesto.encuadernacion=Encuadernación
presupuesto.fresado=Fresado
presupuesto.fresado-descripcion=Fresado (a partir de 32 páginas)
presupuesto.cosido=Cosido
presupuesto.cosido-descripcion=Cosido (a partir de 32 páginas)
presupuesto.grapado=Grapado
presupuesto.grapado-descripcion=Grapado (entre 12 y 40 páginas)
presupuesto.espiral=Espiral
presupuesto.espiral-descripcion=Espiral (a partir de 20 páginas)
presupuesto.wire-o=Wire-O
presupuesto.wire-o-descripcion=Wire-O (a partir de 20 páginas)
presupuesto.encuadernacion-descripcion=Seleccione la encuadernación del libro
presupuesto.continuar-interior=Continuar a diseño interior
# Pestaña interior de presupuesto
presupuesto.tipo-encuadernacion=Tipo de impresión
presupuesto.tipo-encuadernacion-descripcion=Seleccione entre calidad estándar o premium
presupuesto.tipo-interior=Tipo de impresión
presupuesto.tipo-interior-descripcion=Seleccione entre calidad estándar o premium
presupuesto.papel-interior=Papel interior
presupuesto.papel-interior-descripcion=Seleccione el papel para el interior
presupuesto.gramaje-interior=Gramaje interior
@ -70,7 +75,7 @@ presupuesto.impresion-cubierta=Impresión de cubierta
presupuesto.impresion-cubierta-help=La cubierta se puede imprimir por anverso y reverso, como en el caso de las revistas, pero para un libro normal con portada y contraportada, la impresión de cubierta es a una cara.
presupuesto.una-cara=Una cara
presupuesto.dos-caras=Dos caras
presupuesto.tamanio-solapa=Tamaño solapa
presupuesto.tamanio-solapa=Tamaño solapas
presupuesto.papel-guardas=Papel de guardas
presupuesto.guardas-impresas=Guardas impresas
presupuesto.no=No
@ -152,6 +157,7 @@ presupuesto.interior-libro=Interior del libro
presupuesto.cubierta-libro=Cubierta del libro
presupuesto.extras-libro=Extras del libro
presupuesto.paginas=Páginas
presupuesto.solapas=Solapas
# Errores
presupuesto.errores-title=Corrija los siguientes errores:

View File

@ -20,6 +20,7 @@ class imagen_presupuesto {
for (const [key, value] of Object.entries(this.extraData)) {
contenedor.attr(`data-${key}`, value);
}
contenedor.attr("data-summary-text", this.texto); // Para el resumen
const input = $('<input>', {
type: 'radio',

View File

@ -1,6 +1,7 @@
import imagen_presupuesto from "./imagen-presupuesto.js";
import ServiceOptionCard from "./service-option-card.js";
import TiradaCard from "./tirada-price-card.js";
import * as Summary from "./summary.js";
class PresupuestoCliente {
@ -122,22 +123,25 @@ class PresupuestoCliente {
// pestaña extras
this.divExtras = $('#div-extras');
// resumen
this.summaryTableInterior = $('#summary-interior');
}
init() {
const stored = sessionStorage.getItem("formData");
this.#initDatosGenerales();
this.#initCubierta();
if (stored) {
this.formData = JSON.parse(stored);
this.#loadDatosGeneralesData();
this.#loadCubiertaData();
}
this.#initInterior();
this.#initSeleccionTirada();
this.#initExtras();
@ -157,10 +161,6 @@ class PresupuestoCliente {
}
});
$('.custom-nav .nav-link').on('click', function (e) {
e.preventDefault();
e.stopImmediatePropagation(); // frena el handler de Bootstrap
});
}
#cacheFormData() {
@ -241,7 +241,7 @@ class PresupuestoCliente {
});
$('.paginas').on('change', () => {
this.paginas.val(parseInt(this.paginasNegro.val()) + parseInt(this.paginasColor.val()));
$('#paginas').val(parseInt(this.paginasNegro.val()) + parseInt(this.paginasColor.val()));
if (parseInt(this.paginasColor.val()) == 0) {
this.divPosicionPaginasColor.addClass('d-none');
this.posicionPaginasColor.val("");
@ -249,7 +249,8 @@ class PresupuestoCliente {
else {
this.divPosicionPaginasColor.removeClass('d-none');
}
this.paginas = parseInt(this.paginasNegro.val()) + parseInt(this.paginasColor.val());
$('#paginas').val(parseInt(this.paginasNegro.val()) + parseInt(this.paginasColor.val()));
Summary.updatePaginas();
this.#updateTipoEncuadernacion();
});
@ -262,11 +263,31 @@ class PresupuestoCliente {
this.divFormatoPersonalizado.addClass('d-none');
this.divFormato.removeClass('d-none');
}
Summary.updateFormato();
});
this.btn_next_datos_generales.on('click', () => {
this.#nextDatosGenerales();
});
// Eventos para el resumen
$(document).on('change', 'input[name="tipoEncuadernacion"]', (e) => {
if ($(e.target).is(':checked')) {
// Actualizar el resumen
Summary.updateEncuadernacion();
}
});
this.formato.on('change', () => {
Summary.updateFormato();
});
this.ancho.on('change', () => {
Summary.updateFormato();
});
this.alto.on('change', () => {
Summary.updateFormato();
});
}
#nextDatosGenerales() {
@ -382,11 +403,17 @@ class PresupuestoCliente {
this.posicionPaginasColor.val(this.formData.datosGenerales.posicionPaginasColor);
this.formatoPersonalizado.prop('checked', this.formData.datosGenerales.formatoPersonalizado);
if( this.formData.datosGenerales.formatoPersonalizado ) {
this.ancho.val(this.formData.datosGenerales.ancho);
this.alto.val(this.formData.datosGenerales.alto);
}
$('.tipo-libro').removeClass('selected');
$('.image-container#' + this.formData.datosGenerales.tipoEncuadernacion).trigger('click');
this.#updateTipoEncuadernacion();
this.formatoPersonalizado.prop('checked', this.formData.datosGenerales.formatoPersonalizado).trigger('change');
this.formatoPersonalizado.trigger('change');
$('.paginas').trigger('change');
@ -426,7 +453,7 @@ class PresupuestoCliente {
#updateTipoEncuadernacion() {
const paginas = parseInt(this.paginas.val());
const paginas = parseInt($('#paginas').val());
const selectedTipo = $('.tipo-libro.selected').attr('id');
$('.tipo-libro').removeClass('selected');
@ -466,6 +493,7 @@ class PresupuestoCliente {
if ($('.tipo-libro.selected').length > 0) {
this.formData.datosGenerales.tipoEncuadernacion = $('.tipo-libro.selected').attr('id');
Summary.updateEncuadernacion();
}
else {
this.formData.datosGenerales.tipoEncuadernacion = '';
@ -492,6 +520,7 @@ class PresupuestoCliente {
$(document).on('click', '.opcion-color', (e) => {
const data = this.#getPresupuestoData();
Summary.updateTipoImpresion();
this.divPapelInterior.empty();
this.divGramajeInterior.empty();
@ -528,6 +557,9 @@ class PresupuestoCliente {
});
this.#addGramajesInterior(gramajes);
Summary.updatePapelInterior();
Summary.updateGramajeInterior();
},
error: (xhr, status, error) => {
@ -540,6 +572,8 @@ class PresupuestoCliente {
const data = this.#getPresupuestoData();
Summary.updatePapelInterior();
this.divGramajeInterior.removeClass('animate-fadeInUpBounce');
this.divGramajeInterior.empty();
@ -562,6 +596,7 @@ class PresupuestoCliente {
const dataInterior = this.#getInteriorData();
this.#updateInteriorData(dataInterior);
this.#cacheFormData();
Summary.updateGramajeInterior();
}).fail((xhr, status, error) => {
console.error("Error al obtener los gramajes de interior: ", xhr.responseText);
@ -589,6 +624,8 @@ class PresupuestoCliente {
return textoActual.replace(/\d+/, maxSolapas);
});
Summary.updateGramajeInterior();
}).fail((xhr, status, error) => {
console.error("Error al obtener los gramajes de interior: ", xhr.responseText);
});
@ -605,7 +642,7 @@ class PresupuestoCliente {
data: data,
success: (data) => {
if (id === 'btn-prev-interior') {
this.summaryTableInterior.addClass('d-none');
this.#changeTab('pills-general-data');
} else {
const maxSolapas = data.solapas ?? 120;
@ -667,6 +704,8 @@ class PresupuestoCliente {
#loadInteriorData(data) {
this.summaryTableInterior.removeClass('d-none');
this.divOpcionesColor.empty();
this.divPapelInterior.empty();
this.divGramajeInterior.empty();
@ -702,6 +741,10 @@ class PresupuestoCliente {
const dataInterior = this.#getInteriorData();
this.#updateInteriorData(dataInterior);
this.#cacheFormData();
Summary.updateTipoImpresion();
Summary.updatePapelInterior();
Summary.updateGramajeInterior();
}
#addGramajesInterior(gramajes) {

View File

@ -0,0 +1,70 @@
export function updateEncuadernacion() {
const $selected = $('.tipo-libro.selected');
if ($selected.length > 0) {
const resumen = $selected.data('summary-text') || $selected.attr('id');
$('#summary-encuadernacion').text(resumen);
}
}
export function updateFormato(){
if($('#formato-personalizado').is(':checked')) {
$('#summary-formato').text($('#ancho').val() + 'x' + $('#alto').val() + ' mm');
} else {
const $selected = $('#formato option:selected');
const resumen = $selected.data('summary-text') || $selected.val();
$('#summary-formato').text(resumen + ' mm');
}
}
export function updatePaginas() {
const paginas = $('#paginas').val();
$('#summary-paginas').text(paginas );
const paginasColor = $('#paginas-color').val();
$('#summary-paginas-color').text(paginasColor );
const paginasNegro = $('#paginas-negro').val();
$('#summary-paginas-negro').text(paginasNegro );
}
export function updateTipoImpresion() {
const $selected = $('.opcion-color.selected');
if ($selected.length > 0) {
const resumen = $selected.data('summary-text') || $selected.attr('id');
$('#summary-tipo-interior').text(resumen);
}
}
export function updatePapelInterior() {
const $selected = $('.papel-interior.selected');
if ($selected.length > 0) {
const resumen = $selected.data('summary-text') || $selected.val();
$('#summary-papel-interior').text(resumen);
}
}
export function updateGramajeInterior() {
const gramaje = $('input[name="gramaje-interior"]:checked');
if(gramaje.length > 0) {
$('#summary-gramaje-interior').text(gramaje.data('gramaje'));
}
}
export function updateTapaCubierta(){
const $selected = $('.tipo-cubierta.selected');
if ($selected.length > 0) {
const resumen = $selected.data('summary-text') || $selected.attr('id');
$('#summary-tapa-cubierta').text(resumen);
}
if($selected.attr('id') === 'tapaBlanda') {
$('#summary-cubierta').removeClass('d-none');
$('#summary-cubierta .table-responsive').removeClass('d-none');
}
}

View File

@ -23,7 +23,8 @@
<div class="mb-3">
<label for="titulo" class="form-label" th:text="#{presupuesto.titulo}">
>Título*</label>
<input type="text" class="form-control datos-generales-data" id="titulo" placeholder="" value="">
<input type="text" class="form-control datos-generales-data" id="titulo" placeholder=""
value="">
</div>
</div>
</div>
@ -47,19 +48,23 @@
<div class="row">
<div class="col-sm-3 mb-1">
<label for="tirada1" class="form-label" th:text="#{presupuesto.tirada1}">Tirada 1*</label>
<input type="number" class="form-control datos-generales-data" id="tirada1" placeholder="" value="10">
<input type="number" class="form-control datos-generales-data" id="tirada1" placeholder=""
value="10">
</div>
<div class="col-sm-3 mb-1">
<label for="tirada2" class="form-label" th:text="#{presupuesto.tirada2}">Tirada 2</label>
<input type="number" class="form-control datos-generales-data" id="tirada2" placeholder="" value="">
<input type="number" class="form-control datos-generales-data" id="tirada2" placeholder=""
value="">
</div>
<div class="col-sm-3 mb-1">
<label for="tirada3" class="form-label" th:text="#{presupuesto.tirada3}">Tirada 3</label>
<input type="number" class="form-control datos-generales-data" id="tirada3" placeholder="" value="">
<input type="number" class="form-control datos-generales-data" id="tirada3" placeholder=""
value="">
</div>
<div class="col-sm-3 mb-1">
<label for="tirada4" class="form-label" th:text="#{presupuesto.tirada4}">Tirada 4</label>
<input type="number" class="form-control datos-generales-data" id="tirada4" placeholder="" value="">
<input type="number" class="form-control datos-generales-data" id="tirada4" placeholder=""
value="">
</div>
</div>
<p class="text-muted" th:text="#{presupuesto.tiradasPODnoPOD(${pod})}">
@ -95,20 +100,21 @@
<div class="row justify-content-center div-formato-personalizado d-none">
<div class="col-3 col-sm-3 mb-1">
<label for="ancho" class="form-label" th:text="#{presupuesto.ancho}">Ancho (mm)</label>
<input type="number" class="form-control datos-generales-data" id="ancho" name="ancho" value="210"
th:attr="min=${ancho_alto_min}, max=${ancho_alto_max}">
<input type="number" class="form-control datos-generales-data" id="ancho" name="ancho"
value="210" th:attr="min=${ancho_alto_min}, max=${ancho_alto_max}">
</div>
<div class="col-3 col-sm-3 mb-1">
<label for="alto" class="form-label" th:text="#{presupuesto.alto}">Alto (mm)</label>
<input type="number" class="form-control datos-generales-data" id="alto" name="alto" value="297"
th:attr="min=${ancho_alto_min}, max=${ancho_alto_max}">
<input type="number" class="form-control datos-generales-data" id="alto" name="alto"
value="297" th:attr="min=${ancho_alto_min}, max=${ancho_alto_max}">
</div>
</div>
<div class="row justify-content-center mb-3">
<div class="col-sm-4 d-flex justify-content-center">
<div class="form-check form-switch form-switch-custom form-switch-primary mb-3">
<input type="checkbox" class="form-check-input form-switch-custom-primary datos-generales-data"
<input type="checkbox"
class="form-check-input form-switch-custom-primary datos-generales-data"
id="formato-personalizado" name="formato-personalizado">
<label for="formato-personalizado" class="form-label"
th:text="#{presupuesto.formato-personalizado}">
@ -125,8 +131,8 @@
<div class="col-sm-2">
<label for="paginas-negro" class="form-label" th:text="#{presupuesto.paginas-negro}">Páginas
Negro</label>
<input type="number" step="2" class="form-control paginas datos-generales-data" id="paginas-negro"
name="paginas-negro" value="0">
<input type="number" step="2" class="form-control paginas datos-generales-data"
id="paginas-negro" name="paginas-negro" value="0">
<div class="form-text" th:text="#{presupuesto.siempre-pares}">
Siempre deben ser pares</div>
</div>
@ -138,8 +144,8 @@
<div class="col-sm-2">
<label for="paginas-color" class="form-label" th:text="#{presupuesto.paginas-color}">Páginas
Color</label>
<input type="number" step="2" class="form-control paginas datos-generales-data" id="paginas-color"
name="paginas-color" value="32">
<input type="number" step="2" class="form-control paginas datos-generales-data"
id="paginas-color" name="paginas-color" value="32">
<div class="form-text" th:text="#{presupuesto.siempre-pares}">
Siempre deben ser pares</div>
</div>
@ -189,7 +195,8 @@
<div class="d-flex flex-wrap justify-content-center gap-3 imagen-container-group">
<!-- Opción: Fresado -->
<div class="tipo-libro image-container imagen-selector selected datos-generales-data" id="fresado">
<div class="tipo-libro image-container imagen-selector selected datos-generales-data"
th:attr="data-summary-text=#{presupuesto.fresado}" id="fresado">
<input type="radio" name="tipoEncuadernacion" value="fresado" hidden>
<img class="image-presupuesto" src="/assets/images/imprimelibros/presupuestador/fresado.png"
alt="Fresado" />
@ -199,7 +206,8 @@
<!-- Opción: Cosido -->
<div class="tipo-libro image-container imagen-selector datos-generales-data" id="cosido">
<div class="tipo-libro image-container imagen-selector datos-generales-data"
th:attr="data-summary-text=#{presupuesto.cosido}" id="cosido">
<input type="radio" name="tipoEncuadernacion" value="cosido" hidden>
<img class="image-presupuesto" src="/assets/images/imprimelibros/presupuestador/cosido.png"
alt="Cosido" />
@ -209,7 +217,8 @@
<!-- Opción: Grapado -->
<div class="tipo-libro image-container imagen-selector datos-generales-data" id="grapado">
<div class="tipo-libro image-container imagen-selector datos-generales-data"
th:attr="data-summary-text=#{presupuesto.grapado}" id="grapado">
<input type="radio" name="tipoEncuadernacion" value="grapado" hidden>
<img class="image-presupuesto" src="/assets/images/imprimelibros/presupuestador/grapado.png"
alt="Grapado" />
@ -218,7 +227,8 @@
</div>
<!-- Opción: Espiral -->
<div class="tipo-libro image-container imagen-selector datos-generales-data" id="espiral">
<div class="tipo-libro image-container imagen-selector datos-generales-data"
th:attr="data-summary-text=#{presupuesto.espiral}" id="espiral">
<input type="radio" name="tipoEncuadernacion" value="espiral" hidden>
<img class="image-presupuesto" src="/assets/images/imprimelibros/presupuestador/espiral.png"
alt="Espiral" />
@ -227,7 +237,8 @@
</div>
<!-- Opción: Wire-O -->
<div class="tipo-libro image-container imagen-selector datos-generales-data" id="wireo">
<div class="tipo-libro image-container imagen-selector datos-generales-data"
th:attr="data-summary-text=#{presupuesto.wire-o}" id="wireo">
<input type="radio" name="tipoEncuadernacion" value="wireo" hidden>
<img class="image-presupuesto" src="/assets/images/imprimelibros/presupuestador/wire-o.png"
alt="Wire-O" />

View File

@ -2,9 +2,9 @@
<!-- Ribbon Shape -->
<div class="card ribbon-box border shadow-none mb-lg-0 material-shadow">
<div class="card-body">
<div class="ribbon ribbon-primary ribbon-shape" th:text="#{presupuesto.tipo-encuadernacion}">Tipo de impresión
<div class="ribbon ribbon-primary ribbon-shape" th:text="#{presupuesto.tipo-interior}">Tipo de impresión
</div>
<h5 class="fs-14 text-end" th:text="#{presupuesto.tipo-encuadernacion-descripcion}">Elija entre calidad estándar
<h5 class="fs-14 text-end" th:text="#{presupuesto.tipo-interior-descripcion}">Elija entre calidad estándar
o premium</h5>
</div>

View File

@ -9,7 +9,7 @@
</div>
<div class="card-body">
<div class="table-responsive table-card">
<table id="summary-interior" class="table table-responsive align-middle mb-0">
<table id="summary-datos-generales" class="table table-responsive align-middle mb-0">
<thead class="table-light">
<tr>
<th th:text="#{presupuesto.resumen-libro}" scope="col" colspan="2">Libro</th>
@ -20,47 +20,98 @@
<td class="align-items-center">
<span th:text="#{presupuesto.resumen-encuadernacion}"></span>
</td>
<td id="summary-formato" class="text-end">Fresado</td>
<td id="summary-encuadernacion" class="text-end">Fresado</td>
</tr>
<tr>
<td>
<span th:text="#{presupuesto.formato}"></span>
</td>
<td id="summary-paginas" class="text-end">148 x 210 mm</td>
<td id="summary-formato" class="text-end"></td>
</tr>
<tr>
<td>
<span th:text="#{presupuesto.paginas}"></span>
</td>
<td id="summary-paginas" class="text-end">148 x 210 mm</td>
<td id="summary-paginas" class="text-end"></td>
</tr>
<tr>
<td class="ps-3">
<span class="ps-3" th:text="#{presupuesto.paginas-negro}"></span>
</td>
<td id="summary-paginas" class="text-end">148 x 210 mm</td>
<td id="summary-paginas-negro" class="text-end"></td>
</tr>
<tr>
<td class="ps-3">
<span class="ps-3" th:text="#{presupuesto.paginas-color}"></span>
</td>
<td id="summary-paginas" class="text-end">148 x 210 mm</td>
<td id="summary-paginas-color" class="text-end"></td>
</tr>
</tbody>
</table>
<table id="summary-cubierta" class="table table-borderless align-middle mb-0 d-none">
<thead class="table-light text-muted ">
<table id="summary-interior" class="table table-responsive align-middle mb-0 d-none">
<thead class="table-light">
<tr>
<th th:text="#{presupuesto.cubierta-libro}" scope="col" colspan="2">Cubierta del libro</th>
<th th:text="#{presupuesto.interior}" scope="col" colspan="2">Interior</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<p th:text="#{presupuesto.paginas}"></p>
<span th:text="#{presupuesto.tipo-interior}"></span>
</td>
<td id="summary-paginas2" class="text-end">148 x 210 mm</td>
<td id="summary-tipo-interior" class="text-end"></td>
</tr>
<tr>
<td>
<span th:text="#{presupuesto.papel-interior}"></span>
</td>
<td id="summary-papel-interior" class="text-end"></td>
</tr>
<tr>
<td>
<span th:text="#{presupuesto.gramaje-interior}"></span>
</td>
<td id="summary-gramaje-interior" class="text-end"></td>
</tr>
</tbody>
</table>
<table id="summary-cubierta" class="table table-responsive align-middle mb-0 d-none">
<thead class="table-light">
<tr>
<th th:text="#{presupuesto.cubierta}" scope="col" colspan="2">Cubierta</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<span th:text="#{presupuesto.tipo-cubierta}"></span>
</td>
<td id="summary-tipo-cubierta" class="text-end"></td>
</tr>
<tr id="summary-cubierta-solapas-row" class="d-none">
<td>
<span th:text="#{presupuesto.papel-cubierta}"></span>
</td>
<td id="summary-cubierta-solapas" class="text-end"></td>
</tr>
<tr id="summary-cubierta-solapas-row" class="d-none">
<td>
<span th:text="#{presupuesto.solapas}"></span>
</td>
<td id="summary-cubierta-solapas" class="text-end"></td>
</tr>
<tr id="summary-tamanio-solapa-row" class="d-none">
<td>
<span th:text="#{presupuesto.tamanio-solapa}"></span>
</td>
<td id="summary-tamanio-solapa" class="text-end"></td>
</tr>
<tr>
<td>
<span th:text="#{presupuesto.gramaje-cubierta}"></span>
</td>
<td id="summary-gramaje-cubierta" class="text-end"></td>
</tr>
</tbody>
</table>

View File

@ -10,15 +10,15 @@
<ul class="nav nav-pills nav-justified custom-nav" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link fs-15 p-3 active" id="pills-general-data-tab"
data-bs-toggle="pill" data-bs-target="#pills-general-data" type="button"
role="tab" aria-controls="pills-general-data" aria-selected="true">
data-bs-target="#pills-general-data" type="button" role="tab"
aria-controls="pills-general-data" aria-selected="true">
<i
class="ri-information-line fs-16 p-2 bg-soft-primary text-primary rounded-circle align-middle me-2"></i>
<label th:text="#{presupuesto.datos-generales}">Datos Generales</label>
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link fs-15 p-3" id="pills-inside-tab" data-bs-toggle="pill"
<button class="nav-link fs-15 p-3" id="pills-inside-tab"
data-bs-target="#pills-inside" type="button" role="tab"
aria-controls="pills-inside" aria-selected="false">
<i
@ -27,7 +27,7 @@
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link fs-15 p-3" id="pills-cover-tab" data-bs-toggle="pill"
<button class="nav-link fs-15 p-3" id="pills-cover-tab"
data-bs-target="#pills-cover" type="button" role="tab"
aria-controls="pills-cover" aria-selected="false">
<i
@ -37,15 +37,15 @@
</li>
<li class="nav-item" role="presentation">
<button class="nav-link fs-15 p-3" id="pills-seleccion-tirada-tab"
data-bs-toggle="pill" data-bs-target="#pills-seleccion-tirada" type="button"
role="tab" aria-controls="pills-seleccion-tirada" aria-selected="false">
data-bs-target="#pills-seleccion-tirada" type="button" role="tab"
aria-controls="pills-seleccion-tirada" aria-selected="false">
<i
class="ri-add-box-line fs-16 p-2 bg-soft-primary text-primary rounded-circle align-middle me-2"></i>
<label th:text="#{presupuesto.seleccion-tirada}">Seleccion de tirada</label>
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link fs-15 p-3" id="pills-extras-tab" data-bs-toggle="pill"
<button class="nav-link fs-15 p-3" id="pills-extras-tab"
data-bs-target="#pills-extras" type="button" role="tab"
aria-controls="pills-extras" aria-selected="false">
<i