terminado hasta gramaje de cubierta

This commit is contained in:
Jaime Jiménez
2025-08-05 10:06:41 +02:00
parent 29dbd21693
commit e7589de194
13 changed files with 648 additions and 235 deletions

View File

@ -4,10 +4,14 @@ logging.level.org.springframework.security=DEBUG
logging.level.root=WARN
logging.level.org.springframework=ERROR
spring.datasource.url=jdbc:mysql://localhost:3306/imprimelibros
spring.datasource.url=jdbc:mysql://localhost:3309/imprimelibros
spring.datasource.username=imprimelibros_user
spring.datasource.password=om91irrDctd
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
safekat.api.url=http://localhost:8000/
safekat.api.email=imnavajas@coit.es
safekat.api.password"=Safekat2024
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

View File

@ -48,6 +48,7 @@ presupuesto.blanco-negro-premium= Blanco y negro Premium
presupuesto.color=Color
presupuesto.color-premium=Color Premium
presupuesto.offset-blanco=Offset Blanco
presupuesto.offset-blanco-volumen=Offset Blanco Volumen
presupuesto.offset-ahuesado=Offset Ahuesado
presupuesto.offset-ahuesado-volumen=Offset Ahuesado Volumen
presupuesto.estucado-mate=Estucado Mate
@ -85,7 +86,8 @@ presupuesto.gramaje-cubierta=Gramaje cubierta
presupuesto.gramaje-cubierta-descripcion=Seleccione el gramaje para la cubierta
presupuesto.volver-interior=Volver a diseño interior
presupuesto.continuar-extras-libro=Continuar a extras del libro
presupuesto.offset=Offset
presupuesto.estucado=Estucado
# Errores
presupuesto.errores-title=Corrija los siguientes errores:

View File

@ -92,4 +92,5 @@
.animate-fadeInUpBounce {
animation: fadeInUpBounce 0.6s ease-out both;
animation-delay: 0.1s;
will-change: transform;
}

View File

@ -26,7 +26,7 @@ class PresupuestoCliente {
interior: {
tipoImpresion: 'negro',
papelInteriorId: 3,
gramajeInterior: 9,
gramajeInterior: 80,
},
cubierta: {
tipoCubierta: 'tapaBlanda',
@ -86,6 +86,21 @@ class PresupuestoCliente {
this.#initInterior();
this.#initCubierta();
$(document).on('change', 'input[min][max]', function () {
const $input = $(this);
let valor = parseFloat($input.val());
const min = parseFloat($input.attr('min'));
const max = parseFloat($input.attr('max'));
if (isNaN(valor)) return;
if (valor < min) {
$input.val(min);
} else if (valor > max) {
$input.val(max);
}
});
const stored = sessionStorage.getItem("formData");
if (stored) {
this.formData = JSON.parse(stored);
@ -114,6 +129,7 @@ class PresupuestoCliente {
}
#addGramaje(contenedor, gramaje, name) {
const id = `gramaje-${gramaje}`;
// Crear input
@ -126,7 +142,7 @@ class PresupuestoCliente {
// Crear label
const label = document.createElement('label');
label.className = 'btn btn-outline-primary material-shadow gramaje-radio';
label.className = 'btn btn-outline-primary material-shadow gramaje-radio gramaje-interior';
label.setAttribute('for', id);
label.textContent = gramaje;
@ -383,28 +399,109 @@ class PresupuestoCliente {
this.#cacheFormData();
});
$(document).on('click', '.opcion-color', (e) => {
const data = this.#getPresupuestoData();
this.divPapelInterior.empty();
this.divGramajeInterior.empty();
this.divPapelInterior.removeClass('animate-fadeInUpBounce');
this.divGramajeInterior.removeClass('animate-fadeInUpBounce');
$.ajax({
url: '/presupuesto/public/get-papel-interior',
type: 'POST',
data: data,
success: (data) => {
this.divPapelInterior.addClass('animate-fadeInUpBounce');
this.divGramajeInterior.addClass('animate-fadeInUpBounce');
const opciones_papel_interior = data.opciones_papel_interior;
for (let i = 0; i < opciones_papel_interior.length; i++) {
const opcion = opciones_papel_interior[i];
const item = new imagen_presupuesto(opcion);
item.extraClass = 'interior-data papel-interior';
if (opcion.id === this.formData.interior.papelInteriorId) {
item.setSelected(true);
}
this.divPapelInterior.append(item.render());
}
const gramajes = data.opciones_gramaje_interior;
const maxSolapas = data.solapas ?? 120;
$('.solapas-presupuesto').attr('max', maxSolapas);
$('.max-solapa-text').text(function (_, textoActual) {
return textoActual.replace(/\d+/, maxSolapas);
});
this.#addGramajesInterior(gramajes);
},
error: (xhr, status, error) => {
console.error("Error al obtener los papeles de interior: ", xhr.responseText);
}
});
});
$(document).on('click', '.papel-interior', (e) => {
this.divGramajeInterior.removeClass('animate-fadeInUpBounce');
const data = this.#getPresupuestoData();
this.divGramajeInterior.removeClass('animate-fadeInUpBounce');
this.divGramajeInterior.empty();
$.ajax({
url: '/presupuesto/public/get-gramaje-interior',
type: 'POST',
data: data,
}).done((data) => {
this.divGramajeInterior.empty();
const gramajes = data.opciones_gramaje_interior;
this.#addGramajesInterior(gramajes);
this.divGramajeInterior.addClass('animate-fadeInUpBounce');
const maxSolapas = data.solapas ?? 120;
$('.solapas-presupuesto').attr('max', maxSolapas);
$('.max-solapa-text').text(function (_, textoActual) {
return textoActual.replace(/\d+/, maxSolapas);
});
const dataInterior = this.#getInteriorData();
this.#updateInteriorData(dataInterior);
this.#cacheFormData();
}).fail((xhr, status, error) => {
console.error("Error al obtener los gramajes de interior: ", xhr.responseText);
});
});
$(document).on('click', '.gramaje-interior', (e) => {
const inputId = $(e.currentTarget).attr('for');
const gramaje = parseInt($('#' + inputId).data('gramaje'));
this.formData.interior.gramajeInterior = gramaje;
this.#cacheFormData();
const data = this.#getPresupuestoData();
$.ajax({
url: '/presupuesto/public/get-max-solapas',
type: 'POST',
data: data,
}).done((data) => {
const maxSolapas = data.solapas ?? 120;
$('.solapas-presupuesto').attr('max', maxSolapas);
$('.max-solapa-text').text(function (_, textoActual) {
return textoActual.replace(/\d+/, maxSolapas);
});
}).fail((xhr, status, error) => {
console.error("Error al obtener los gramajes de interior: ", xhr.responseText);
});
});
@ -418,10 +515,15 @@ class PresupuestoCliente {
type: 'POST',
data: data,
success: (data) => {
if( id === 'btn-prev-interior') {
if (id === 'btn-prev-interior') {
this.#changeTab('pills-general-data');
} else {
const maxSolapas = data.solapas ?? 120;
$('.solapas-presupuesto').attr('max', maxSolapas);
$('.max-solapa-text').text(function (_, textoActual) {
return textoActual.replace(/\d+/, maxSolapas);
});
$('.tapa-cubierta.selected').trigger('click');
this.#changeTab('pills-cover');
}
@ -459,7 +561,7 @@ class PresupuestoCliente {
for (let i = 0; i < opciones_color.length; i++) {
const opcion = opciones_color[i];
const item = new imagen_presupuesto(opcion);
item.extraClass = 'interior-data';
item.extraClass = 'interior-data opcion-color';
if ((this.formData.interior.color === '' && i === 0) ||
this.formData.interior.color === opcion.id) {
item.setSelected(true);
@ -491,9 +593,9 @@ class PresupuestoCliente {
this.#addGramaje(this.divGramajeInterior, gramaje, 'gramaje-interior');
// Seleccionar el gramaje por defecto
if (this.formData.interior.gramaje === '' && i === 0) {
if (this.formData.interior.gramajeInterior === '' && i === 0) {
$(`#gramaje-${gramaje}`).prop('checked', true);
} else if (this.formData.interior.gramaje === gramaje) {
} else if (this.formData.interior.gramajeInterior == gramaje) {
$(`#gramaje-${gramaje}`).prop('checked', true);
}
}
@ -507,11 +609,11 @@ class PresupuestoCliente {
const tipoImpresion = $('#div-opciones-color .image-container.selected').attr('id') || 'negro';
const papelInteriorId = $('#div-papel-interior .image-container.selected').data('sk-id') || 3;
const gramejeInterior = $('input[name="gramaje-interior"]:checked').data('gramaje') || 90;
const gramajeInterior = $('input[name="gramaje-interior"]:checked').data('gramaje') || 90;
return {
tipoImpresion: tipoImpresion,
papelInteriorId: papelInteriorId,
gramejeInterior: gramejeInterior
gramajeInterior: gramajeInterior
};
}
@ -519,7 +621,7 @@ class PresupuestoCliente {
this.formData.interior.tipoImpresion = data.tipoImpresion;
this.formData.interior.papelInteriorId = data.papelInteriorId;
this.formData.interior.gramejeInterior = data.gramejeInterior;
this.formData.interior.gramajeInterior = data.gramajeInterior;
}
@ -566,92 +668,147 @@ class PresupuestoCliente {
$(document).on('click', '.tapa-cubierta', (e) => {
const prevTargetisTapaDura = !$('.tapa-dura-options').hasClass('d-none');
$('.tapa-dura-options').eq(0).removeClass('animate-fadeInUpBounce');
$('.tapa-blanda-options').eq(0).removeClass('animate-fadeInUpBounce');
if(e.currentTarget.id === 'tapaBlanda') {
if (e.currentTarget.id === 'tapaBlanda') {
$('.tapa-blanda-options').eq(0).addClass('animate-fadeInUpBounce');
$('.tapa-dura-options').addClass('d-none');
$('.tapa-blanda-options').removeClass('d-none');
$('.tapa-blanda-options').eq(0).addClass('animate-fadeInUpBounce');
}
else{
else {
$('.tapa-dura-options').eq(0).addClass('animate-fadeInUpBounce');
$('.tapa-blanda-options').addClass('d-none');
$('.tapa-dura-options').removeClass('d-none');
$('.tapa-dura-options').eq(0).addClass('animate-fadeInUpBounce');
}
this.#getPapelesCubierta(e.currentTarget.id);
if (!(e.currentTarget.id !== 'tapaBlanda' && prevTargetisTapaDura)) {
this.#getPapelesCubierta(e.currentTarget.id);
}
});
$(document).on('click', '.solapas-cubierta', (e) => {
if (e.currentTarget.id === 'sin-solapas') {
this.divSolapasCubierta.addClass('d-none');
}
else {
this.divSolapasCubierta.removeClass('d-none');
}
const dataToStore = this.#getCubiertaData();
this.#updateCubiertaData(dataToStore);
this.#cacheFormData();
});
$(document).on('click', '.solapas-cubierta', (e) => {
if(e.currentTarget.id === 'sin-solapas') {
this.divSolapasCubierta.addClass('d-none');
}
else{
this.divSolapasCubierta.removeClass('d-none');
}
const dataToStore = this.#getCubiertaData();
this.#updateCubiertaData(dataToStore);
this.#cacheFormData();
$(document).on('click', '.papel-cubierta', (e) => {
const data = this.#getPresupuestoData();
this.divGramajeCubierta.removeClass('animate-fadeInUpBounce');
this.divGramajeCubierta.empty();
$.ajax({
url: '/presupuesto/public/get-gramaje-cubierta',
type: 'POST',
data: data,
}).done((data) => {
const gramajes = data.opciones_gramaje_cubierta;
this.#addGramajesCubierta(gramajes);
this.divGramajeCubierta.addClass('animate-fadeInUpBounce');
const dataCubierta = this.#getCubiertaData();
this.#updateCubiertaData(dataCubierta);
this.#cacheFormData();
}).fail((xhr, status, error) => {
console.error("Error al obtener los gramajes de interior: ", xhr.responseText);
});
});
}
#getPapelesCubierta(tapa_id) {
this.divPapelCubierta.removeClass('animate-fadeInUpBounce');
new Promise((resolve) => {
this.divPapelCubierta.empty();
this.divGramajeCubierta.empty();
setTimeout(resolve, 250);
}).then(() => {
this.divPapelCubierta.removeClass('animate-fadeInUpBounce');
this.divGramajeCubierta.removeClass('animate-fadeInUpBounce');
return $.ajax({
url: '/presupuesto/public/get-papel-cubierta',
type: 'POST',
data: {
tipoCubierta: tapa_id,
papelCubiertaId: this.formData.cubierta.papelCubiertaId,
gramajeCubierta: this.formData.cubierta.gramajeCubierta,
},
success: (data) => {
$.ajax({
url: '/presupuesto/public/get-papel-cubierta',
type: 'POST',
data: {
tipoCubierta: tapa_id,
papelCubiertaId: this.formData.cubierta.papelCubiertaId,
gramajeCubierta: this.formData.cubierta.gramajeCubierta,
},
success: (data) => {
this.divPapelCubierta.addClass('animate-fadeInUpBounce');
this.divGramajeCubierta.addClass('animate-fadeInUpBounce');
this.divPapelCubierta.empty();
this.divGramajeCubierta.empty();
const papelesCubierta = data.opciones_papel_cubierta;
for (let i = 0; i < papelesCubierta.length; i++) {
const papel = papelesCubierta[i];
const item = new imagen_presupuesto(papel);
item.extraClass = 'cubierta-data papel-cubierta';
if (papel.id === this.formData.cubierta.papelCubiertaId) {
item.setSelected(true);
const papelesCubierta = data.opciones_papel_cubierta;
for (let i = 0; i < papelesCubierta.length; i++) {
const papel = papelesCubierta[i];
const item = new imagen_presupuesto(papel);
item.extraClass = 'cubierta-data papel-cubierta';
if (item.extraData["sk-id"] == this.formData.cubierta.papelCubiertaId) {
item.setSelected(true);
}
this.divPapelCubierta.append(item.render());
}
this.divPapelCubierta.append(item.render());
if (this.divPapelCubierta.find('.image-container.selected').length === 0) {
this.divPapelCubierta.find('.image-container').first().addClass('selected');
this.formData.cubierta.papelCubiertaId =
this.divPapelCubierta.find('.image-container').first().data('sk-id') || 3;
}
const gramajesCubierta = data.opciones_gramaje_cubierta;
for (let i = 0; i < gramajesCubierta.length; i++) {
const gramaje = gramajesCubierta[i];
this.#addGramaje(this.divGramajeCubierta, gramaje, 'gramaje-cubierta');
if (this.formData.cubierta.gramajeCubierta === '' && i === 0) {
$(`#gramaje-${gramaje}`).prop('checked', true);
} else if (this.formData.cubierta.gramajeCubierta == gramaje) {
$(`#gramaje-${gramaje}`).prop('checked', true);
}
}
if (this.divGramajeCubierta.find('input[type="radio"]:checked').length === 0) {
this.divGramajeCubierta.find('input[type="radio"]').first().prop('checked', true);
}
const dataToStore = this.#getCubiertaData();
this.#updateCubiertaData(dataToStore);
this.#cacheFormData();
},
error: (xhr, status, error) => {
console.error("Error al obtener los papeles de cubierta: ", xhr.responseText);
$(window).scrollTop(0);
}
this.divPapelCubierta.addClass('animate-fadeInUpBounce');
},
error: (xhr, status, error) => {
console.error("Error al obtener los papeles de cubierta: ", xhr.responseText);
$(window).scrollTop(0);
}
});
});
}
#getCubiertaData() {
const tipoCubierta = $('.cubierta-data.tapa.selected').attr('id') || 'tapaBlanda';
const solapas = parseInt($('#div-solapas-cubierta input[type="radio"]:checked').val()) || 0;
const tipoCubierta = $('.tapa-cubierta.selected').attr('id') || 'tapaBlanda';
const solapas = $('.solapas-cubierta.selected').id == 'sin-solapas' ? 0 : 1 || 0;
const tamanioSolapas = $('#tamanio-solapas-cubierta').val() || '80';
const cubiertaCaras = parseInt($('#cubierta-caras').val()) || 2;
const guardasPapel = parseInt($('#guardas-papel').val()) || 3;
const guardasGramaje = parseInt($('#guardas-gramaje').val()) || 170;
const guardasImpresas = parseInt($('#guardas-impresas').val()) || 0;
const cabezada = $('#cabezada').val() || 'WHI';
const papelCubiertaId = $('#papel-cubierta-id').val() || 3;
const gramajeCubierta = $('#gramaje-cubierta').val() || 170;
const papelCubiertaId = $('#div-papel-cubierta .image-container.selected').data('sk-id') || 3;
const gramajeCubierta = $('input[name="gramaje-cubierta"]:checked').data('gramaje') || 240;
return {
tipoCubierta: tipoCubierta,
@ -680,6 +837,25 @@ class PresupuestoCliente {
this.formData.cubierta.papelCubiertaId = data.papelCubiertaId;
this.formData.cubierta.gramajeCubierta = data.gramajeCubierta;
}
#addGramajesCubierta(gramajes) {
for (let i = 0; i < gramajes.length; i++) {
const gramaje = gramajes[i];
this.#addGramaje(this.divGramajeCubierta, gramaje, 'gramaje-cubierta');
// Seleccionar el gramaje por defecto
if (this.formData.interior.gramajeCubierta === '' && i === 0) {
$(`#gramaje-${gramaje}`).prop('checked', true);
} else if (this.formData.interior.gramajeCubierta == gramaje) {
$(`#gramaje-${gramaje}`).prop('checked', true);
}
}
if (this.divGramajeCubierta.find('input[type="radio"]:checked').length === 0) {
// If not, select the first one by default
this.divGramajeCubierta.find('input[type="radio"]').first().prop('checked', true);
}
}
/******************************
* END CUBIERTA
******************************/

View File

@ -29,7 +29,7 @@
</label>
</div>
<div id="tapaDuraLomoRecto" class="tapa-cubierta image-container imagen-selector">
<div id="tapaDura" class="tapa-cubierta image-container imagen-selector">
<img class="image-presupuesto"
src="/assets/images/imprimelibros/presupuestador/tapa-dura-lomo-recto.png" alt="">
<label class="form-label" th:text="#{presupuesto.tapa-dura}">
@ -46,60 +46,85 @@
</div>
</div>
<div class="row justify-content-center align-items-center mt-3 imagen-container-group tapa-blanda-options">
<div class="row justify-content-center mt-4 imagen-container-group tapa-blanda-options">
<div class="col-auto">
<div class="d-flex flex-wrap align-items-center gap-4 ">
<div id="sin-solapas" class="image-container imagen-selector solapas-cubierta selected">
<img class="image-presupuesto"
src="/assets/images/imprimelibros/presupuestador/sinSolapasCubierta.png" alt="">
<label class="form-label" th:text="#{presupuesto.sin-solapas}">
Sin solapas
</label>
</div>
<!-- Bloque de solapas -->
<div class="d-flex gap-3">
<div id="sin-solapas" class="image-container imagen-selector solapas-cubierta selected">
<img class="image-presupuesto"
src="/assets/images/imprimelibros/presupuestador/sinSolapasCubierta.png" alt="">
<label class="form-label text-center d-block" th:text="#{presupuesto.sin-solapas}">
Sin solapas
</label>
</div>
<div id="con-solapas" class="image-container imagen-selector solapas-cubierta">
<img class="image-presupuesto"
src="/assets/images/imprimelibros/presupuestador/conSolapasCubierta.png" alt="">
<label class="form-label" th:text="#{presupuesto.con-solapas}">
Con solapas
</label>
</div>
<div id="con-solapas" class="image-container imagen-selector solapas-cubierta">
<img class="image-presupuesto"
src="/assets/images/imprimelibros/presupuestador/conSolapasCubierta.png" alt="">
<label class="form-label text-center d-block" th:text="#{presupuesto.con-solapas}">
Con solapas
</label>
</div>
</div>
<!-- Inputs -->
<div class="d-flex flex-column flex-md-row align-items-start gap-3">
<!-- Impresión cubierta -->
<div>
<label for="impresion-cubierta" class="form-label"
th:text="#{presupuesto.impresion-cubierta}">Impresión de cubierta</label>
<div class="input-group input-group-sm">
<select class="form-select select2" id="impresion-cubierta">
<option value="2" th:text="#{presupuesto.una-cara}">Una cara</option>
<option value="4" th:text="#{presupuesto.dos-caras}">Dos caras</option>
</select>
<button
class="btn btn-outline-primary btn-icon waves-effect waves-light material-shadow-none"
type="button" id="impresion-cubierta-help">
<i class="ri-questionnaire-line"></i>
</button>
</div>
</div>
<!-- Tamaño solapa -->
<div id="div-solapas-cubierta" class="d-none">
<label for="tamanio-solapas-cubierta" class="form-label"
th:text="#{presupuesto.tamanio-solapa}">Tamaño solapa</label>
<input type="number" class="form-control form-control-sm solapas-presupuesto"
id="tamanio-solapas-cubierta" min="60" max="120" value="80" step="1">
<div class="form-text">
<p class="mb-0">min: 60 mm</p>
<p class="max-solapa-text">max: 120 mm</p>
</div>
</div>
</div>
<div class="col-auto mb-3">
<label for="impresion-cubierta" class="form-label"
th:text="#{presupuesto.impresion-cubierta}">Impresión de cubierta</label>
<div class="input-group">
<select class="form-select select2" id="impresion-cubierta">
<option value="2" th:text="#{presupuesto.una-cara}">Una cara</option>
<option value="4" th:text="#{presupuesto.dos-caras}">Dos cara</option>
</select>
<button class="btn btn-outline-primary btn-icon waves-effect waves-light material-shadow-none"
type="button" id="impresion-cubierta-help">
<i class="ri-questionnaire-line"></i>
</button>
</div>
</div>
<div id="div-solapas-cubierta" class="col-auto mb-3 d-none">
<label for="tamanio-solapas-cubierta" class="form-label"
th:text="#{presupuesto.tamanio-solapa}">Tamaño solapa</label>
<input type="number" class="form-control" id="tamanio-solapas-cubierta" value="80" step="1">
</div>
</div>
<div class="row justify-content-center align-items-center mt-3 imagen-container-group tapa-dura-options d-none">
<div
class="row justify-content-center align-items-center mt-3 imagen-container-group tapa-dura-options d-none">
<div class="col-auto mb-3">
<label for="papel-guardas" class="form-label" th:text="#{presupuesto.papel-guardas}">Papel de
guardas</label>
<select class="form-select select2" id="papel-guardas">
<option value="1" data-papel-id="3" data-gramaje="170"
th:text="#{presupuesto.offset-blanco} + ' 170 gr'" selected>Offset blanco 170 gr</option>
<option value="2" data-papel-id="4" data-gramaje="170"
th:text="#{presupuesto.offset-ahuesado} + ' 170 gr'">Offset ahuesado 170 gr</option>
<option value="3" data-papel-id="2" data-gramaje="170"
th:text="#{presupuesto.estucado-mate} + ' 170 gr'">Estucado mate 170 gr</option>
<optgroup th:label="#{presupuesto.offset}">
<option value="1" data-papel-id="3" data-gramaje="170"
th:text="#{presupuesto.offset-blanco} + ' 170 gr'" selected>Offset blanco 170 gr
</option>
<option value="2" data-papel-id="4" data-gramaje="170"
th:text="#{presupuesto.offset-ahuesado} + ' 170 gr'">Offset ahuesado 170 gr</option>
</optgroup>
<optgroup th:label="#{presupuesto.estucado}">
<option value="3" data-papel-id="2" data-gramaje="170"
th:text="#{presupuesto.estucado-mate} + ' 170 gr'">Estucado mate 170 gr</option>
</optgroup>
</select>
</div>
<div class="col-auto mb-3">
@ -135,8 +160,8 @@
<div class="ribbon-content mt-4">
<div id="div-papel-cubierta" class="row justify-content-center imagen-container-group">a
<div id="div-papel-cubierta" class="row justify-content-center imagen-container-group">
</div>
</div>

View File

@ -36,37 +36,6 @@
<div id="div-papel-interior" class="row justify-content-center imagen-container-group">
<div id="offset-blanco" data-sk-id="3" class="image-container imagen-selector selected">
<img class="image-presupuesto" src="/assets/images/imprimelibros/presupuestador/offset-blanco.png"
alt="">
<label for="titulo" class="form-label" th:text="#{presupuesto.offset-blanco}">
Offset Blanco
</label>
</div>
<div id="offset-ahuesado" data-sk-id="4" class="image-container imagen-selector">
<img class="image-presupuesto" src="/assets/images/imprimelibros/presupuestador/offset-ahuesado.png"
alt="">
<label class="form-label" th:text="#{presupuesto.offset-ahuesado}">
Offset Ahuesado
</label>
</div>
<div id="offset-ahuesado-volumen" data-sk-id="6" class="image-container imagen-selector">
<img class="image-presupuesto"
src="/assets/images/imprimelibros/presupuestador/offset-ahuesado-volumen.png" alt="">
<label class="form-label" th:text="#{presupuesto.offset-ahuesado-volumen}">
Offset Ahuesado Volumen
</label>
</div>
<div id="estucado-mate" data-sk-id="2" class="image-container imagen-selector">
<img class="image-presupuesto" src="/assets/images/imprimelibros/presupuestador/estucado-mate.png"
alt="">
<label class="form-label" th:text="#{presupuesto.estucado-mate}">
Estucado Mate
</label>
</div>
</div>
</div>
@ -83,32 +52,7 @@
<div class="ribbon-content mt-4">
<div id="div-gramaje-interior" class="hstack gap-2 justify-content-center flex-wrap">
<input type="radio" class="btn-check" data-gramaje="70" id="gramaje-70" name="gramaje-interior">
<label class="btn btn-outline-primary material-shadow gramaje-radio" for="gramaje-70">70</label>
<input type="radio" class="btn-check" data-gramaje="80" id="gramaje-80" name="gramaje-interior">
<label class="btn btn-outline-primary material-shadow gramaje-radio" for="gramaje-80">80</label>
<input type="radio" class="btn-check" data-gramaje="90" id="gramaje-90" checked name="gramaje-interior">
<label class="btn btn-outline-primary material-shadow gramaje-radio" for="gramaje-90">90</label>
<input type="radio" class="btn-check" data-gramaje="100" id="gramaje-100" name="gramaje-interior">
<label class="btn btn-outline-primary material-shadow gramaje-radio" for="gramaje-100">100</label>
<input type="radio" class="btn-check" data-gramaje="115" id="gramaje-115" name="gramaje-interior">
<label class="btn btn-outline-primary material-shadow gramaje-radio" for="gramaje-115">115</label>
<input type="radio" class="btn-check" data-gramaje="120" id="gramaje-120" name="gramaje-interior">
<label class="btn btn-outline-primary material-shadow gramaje-radio" for="gramaje-120">120</label>
<input type="radio" class="btn-check" data-gramaje="135" id="gramaje-135" name="gramaje-interior">
<label class="btn btn-outline-primary material-shadow gramaje-radio" for="gramaje-135">135</label>
<input type="radio" class="btn-check" data-gramaje="150" id="gramaje-150" name="gramaje-interior">
<label class="btn btn-outline-primary material-shadow gramaje-radio" for="gramaje-150">150</label>
<input type="radio" class="btn-check" data-gramaje="170" id="gramaje-170" name="gramaje-interior">
<label class="btn btn-outline-primary material-shadow gramaje-radio" for="gramaje-170">170</label>
</div>
</div>
</div>