mirror of
https://git.imnavajas.es/jjimenez/erp-imprimelibros.git
synced 2026-01-28 06:38:51 +00:00
Merge branch 'feat/cache_serv_data' into 'main'
Feat/cache serv data See merge request jjimenez/erp-imprimelibros!6
This commit is contained in:
6
pom.xml
6
pom.xml
@ -92,6 +92,12 @@
|
|||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jsoup</groupId>
|
||||||
|
<artifactId>jsoup</artifactId>
|
||||||
|
<version>1.17.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|||||||
@ -0,0 +1,20 @@
|
|||||||
|
package com.imprimelibros.erp.common;
|
||||||
|
|
||||||
|
import jakarta.persistence.AttributeConverter;
|
||||||
|
import jakarta.persistence.Converter;
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.safety.Safelist;
|
||||||
|
|
||||||
|
@Converter(autoApply = false)
|
||||||
|
public class HtmlStripConverter implements AttributeConverter<String, String> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String convertToDatabaseColumn(String attribute) {
|
||||||
|
return attribute == null ? null : Jsoup.clean(attribute, Safelist.none());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String convertToEntityAttribute(String dbData) {
|
||||||
|
return dbData; // tal cual
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -8,6 +8,8 @@ import com.imprimelibros.erp.presupuesto.validation.Par;
|
|||||||
import com.imprimelibros.erp.presupuesto.validation.PresupuestoValidationGroups;
|
import com.imprimelibros.erp.presupuesto.validation.PresupuestoValidationGroups;
|
||||||
import com.imprimelibros.erp.presupuesto.validation.Tamanio;
|
import com.imprimelibros.erp.presupuesto.validation.Tamanio;
|
||||||
|
|
||||||
|
import com.imprimelibros.erp.common.HtmlStripConverter;
|
||||||
|
|
||||||
import jakarta.persistence.*;
|
import jakarta.persistence.*;
|
||||||
|
|
||||||
@ConsistentTiradas(groups = PresupuestoValidationGroups.DatosGenerales.class)
|
@ConsistentTiradas(groups = PresupuestoValidationGroups.DatosGenerales.class)
|
||||||
@ -45,13 +47,16 @@ public class Presupuesto implements Cloneable{
|
|||||||
@Column(name = "tipo_encuadernacion")
|
@Column(name = "tipo_encuadernacion")
|
||||||
private TipoEncuadernacion tipoEncuadernacion = TipoEncuadernacion.fresado;
|
private TipoEncuadernacion tipoEncuadernacion = TipoEncuadernacion.fresado;
|
||||||
|
|
||||||
|
@Convert(converter = HtmlStripConverter.class)
|
||||||
@NotBlank(message = "{presupuesto.errores.titulo}", groups = PresupuestoValidationGroups.DatosGenerales.class)
|
@NotBlank(message = "{presupuesto.errores.titulo}", groups = PresupuestoValidationGroups.DatosGenerales.class)
|
||||||
@Column(name = "titulo")
|
@Column(name = "titulo")
|
||||||
private String titulo;
|
private String titulo;
|
||||||
|
|
||||||
|
@Convert(converter = HtmlStripConverter.class)
|
||||||
@Column(name = "autor")
|
@Column(name = "autor")
|
||||||
private String autor;
|
private String autor;
|
||||||
|
|
||||||
|
@Convert(converter = HtmlStripConverter.class)
|
||||||
@Column(name = "isbn")
|
@Column(name = "isbn")
|
||||||
private String isbn;
|
private String isbn;
|
||||||
|
|
||||||
|
|||||||
@ -1,26 +1,49 @@
|
|||||||
spring.application.name=erp
|
spring.application.name=erp
|
||||||
logging.level.org.springframework.security=DEBUG
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Logging
|
||||||
|
#
|
||||||
|
logging.level.org.springframework.security=DEBUG
|
||||||
logging.level.root=WARN
|
logging.level.root=WARN
|
||||||
logging.level.org.springframework=ERROR
|
logging.level.org.springframework=ERROR
|
||||||
|
|
||||||
#debug JPA / Hibernate
|
|
||||||
#spring.jpa.show-sql=true
|
|
||||||
#logging.level.org.hibernate.SQL=DEBUG
|
|
||||||
#logging.level.org.hibernate.orm.jdbc.bind=TRACE
|
|
||||||
#spring.jpa.properties.hibernate.format_sql=true
|
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Database Configuration
|
||||||
|
#
|
||||||
spring.datasource.url=jdbc:mysql://localhost:3309/imprimelibros
|
spring.datasource.url=jdbc:mysql://localhost:3309/imprimelibros
|
||||||
#spring.datasource.url=jdbc:mysql://127.0.0.1:3309/imprimelibros?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Europe/Madrid&characterEncoding=utf8
|
#spring.datasource.url=jdbc:mysql://127.0.0.1:3309/imprimelibros?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Europe/Madrid&characterEncoding=utf8
|
||||||
spring.datasource.username=imprimelibros_user
|
spring.datasource.username=imprimelibros_user
|
||||||
spring.datasource.password=om91irrDctd
|
spring.datasource.password=om91irrDctd
|
||||||
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
|
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
|
||||||
|
|
||||||
|
spring.jpa.hibernate.ddl-auto=update
|
||||||
|
spring.jpa.show-sql=true
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Safekat API Configuration
|
||||||
|
#
|
||||||
safekat.api.url=http://localhost:8000/
|
safekat.api.url=http://localhost:8000/
|
||||||
#safekat.api.url=https://erp-dev.safekat.es/
|
#safekat.api.url=https://erp-dev.safekat.es/
|
||||||
safekat.api.email=imnavajas@coit.es
|
safekat.api.email=imnavajas@coit.es
|
||||||
safekat.api.password=Safekat2024
|
safekat.api.password=Safekat2024
|
||||||
|
|
||||||
spring.jpa.hibernate.ddl-auto=update
|
|
||||||
spring.jpa.show-sql=true
|
#
|
||||||
|
# Debug JPA / Hibernate
|
||||||
|
#
|
||||||
|
#spring.jpa.show-sql=true
|
||||||
|
#logging.level.org.hibernate.SQL=DEBUG
|
||||||
|
#logging.level.org.hibernate.orm.jdbc.bind=TRACE
|
||||||
|
#spring.jpa.properties.hibernate.format_sql=true
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Resource chain
|
||||||
|
# Activa el resource chain y versionado por contenido
|
||||||
|
#
|
||||||
|
spring.web.resources.chain.enabled=true
|
||||||
|
spring.web.resources.chain.strategy.content.enabled=true
|
||||||
|
spring.web.resources.chain.strategy.content.paths=/assets/**
|
||||||
|
|
||||||
|
|||||||
@ -1,9 +1,11 @@
|
|||||||
presupuesto.datos-generales=Datos Generales
|
presupuesto.datos-generales=Datos Generales
|
||||||
presupuesto.interior=Interior
|
presupuesto.interior=Interior
|
||||||
presupuesto.cubierta=Cubierta
|
presupuesto.cubierta=Cubierta
|
||||||
presupuesto.seleccion-tirada=Seleccion de tirada
|
presupuesto.seleccion-tirada=Selección tirada
|
||||||
presupuesto.extras=Extras
|
presupuesto.extras=Extras
|
||||||
|
presupuesto.resumen=Resumen
|
||||||
presupuesto.add-to-presupuesto=Añadir al presupuesto
|
presupuesto.add-to-presupuesto=Añadir al presupuesto
|
||||||
|
presupuesto.calcular=Calcular
|
||||||
|
|
||||||
# Pestaña datos generales de presupuesto
|
# Pestaña datos generales de presupuesto
|
||||||
presupuesto.informacion-libro=Información del libro
|
presupuesto.informacion-libro=Información del libro
|
||||||
@ -153,7 +155,9 @@ presupuesto.volver-cubierta=Volver a diseño cubierta
|
|||||||
presupuesto.finalizar=Finalizar presupuesto
|
presupuesto.finalizar=Finalizar presupuesto
|
||||||
presupuesto.calcular-presupuesto=Calcular presupuesto
|
presupuesto.calcular-presupuesto=Calcular presupuesto
|
||||||
presupuesto.consultar-soporte=Consultar con soporte
|
presupuesto.consultar-soporte=Consultar con soporte
|
||||||
presupuesto.calcular=Calcular
|
|
||||||
|
# Pestaña resumen del presupuesto
|
||||||
|
presupuesto.volver-extras=Volver a extras
|
||||||
|
|
||||||
# Resumen del presupuesto
|
# Resumen del presupuesto
|
||||||
presupuesto.resumen-presupuesto=Resumen presupuesto
|
presupuesto.resumen-presupuesto=Resumen presupuesto
|
||||||
|
|||||||
@ -59,6 +59,38 @@ class PresupuestoCliente {
|
|||||||
acabado: 0
|
acabado: 0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
servicios: {
|
||||||
|
servicios: [],
|
||||||
|
datosMarcapaginas: {
|
||||||
|
marcapaginas_tirada: 100,
|
||||||
|
tamanio_marcapaginas: '_50x140_',
|
||||||
|
caras_impresion: 'una_cara',
|
||||||
|
papel_marcapaginas: 'cartulina_grafica',
|
||||||
|
gramaje_marcapaginas: 300,
|
||||||
|
acabado_marcapaginas: 'ninguno',
|
||||||
|
resultado: {
|
||||||
|
precio_unitario: 0,
|
||||||
|
precio: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
datosMaquetacion: {
|
||||||
|
num_caracteres: 200000,
|
||||||
|
formato_maquetacion: 'A5',
|
||||||
|
cuerpo_texto: 'medium',
|
||||||
|
num_columnas: 1,
|
||||||
|
num_tablas: 0,
|
||||||
|
num_fotos: 0,
|
||||||
|
correccion_ortotipografica: false,
|
||||||
|
texto_mecanografiado: false,
|
||||||
|
disenio_portada: false,
|
||||||
|
epub: false,
|
||||||
|
resultado: {
|
||||||
|
num_paginas_estimadas: 0,
|
||||||
|
precio_pagina_estimado: 0,
|
||||||
|
precio: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
selectedTirada: null,
|
selectedTirada: null,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -152,6 +184,7 @@ class PresupuestoCliente {
|
|||||||
this.#initInterior();
|
this.#initInterior();
|
||||||
this.#initSeleccionTirada();
|
this.#initSeleccionTirada();
|
||||||
this.#initExtras();
|
this.#initExtras();
|
||||||
|
this.#initResumen();
|
||||||
|
|
||||||
$(document).on('change', 'input[min][max]', function () {
|
$(document).on('change', 'input[min][max]', function () {
|
||||||
const $input = $(this);
|
const $input = $(this);
|
||||||
@ -236,8 +269,9 @@ class PresupuestoCliente {
|
|||||||
contenedor.append(label);
|
contenedor.append(label);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************
|
/******************************
|
||||||
* END OF DATOS GENERALES
|
* DATOS GENERALES
|
||||||
******************************/
|
******************************/
|
||||||
#initDatosGenerales() {
|
#initDatosGenerales() {
|
||||||
|
|
||||||
@ -1087,7 +1121,7 @@ class PresupuestoCliente {
|
|||||||
|
|
||||||
const tipoCubierta = $('.tapa-cubierta.selected').attr('id') || 'tapaBlanda';
|
const tipoCubierta = $('.tapa-cubierta.selected').attr('id') || 'tapaBlanda';
|
||||||
const solapas = $('.solapas-cubierta.selected').id == 'sin-solapas' ? 0 : 1 || 0;
|
const solapas = $('.solapas-cubierta.selected').id == 'sin-solapas' ? 0 : 1 || 0;
|
||||||
const tamanioSolapas = $('#tamanio-solapas-cubierta').val() || '80';
|
const tamanioSolapasCubierta = $('#tamanio-solapas-cubierta').val() || '80';
|
||||||
const cubiertaCaras = parseInt(this.carasImpresionCubierta.val()) || 2;
|
const cubiertaCaras = parseInt(this.carasImpresionCubierta.val()) || 2;
|
||||||
const guardasPapelId = parseInt($('#papel-guardas option:selected').data('papel-id')) || 3;
|
const guardasPapelId = parseInt($('#papel-guardas option:selected').data('papel-id')) || 3;
|
||||||
const guardasGramaje = parseInt($('#papel-guardas option:selected').data('gramaje')) || 170;
|
const guardasGramaje = parseInt($('#papel-guardas option:selected').data('gramaje')) || 170;
|
||||||
@ -1111,7 +1145,7 @@ class PresupuestoCliente {
|
|||||||
return {
|
return {
|
||||||
tipoCubierta: tipoCubierta,
|
tipoCubierta: tipoCubierta,
|
||||||
solapas: solapas,
|
solapas: solapas,
|
||||||
tamanioSolapas: tamanioSolapas,
|
tamanioSolapasCubierta: tamanioSolapasCubierta,
|
||||||
cubiertaCaras: cubiertaCaras,
|
cubiertaCaras: cubiertaCaras,
|
||||||
guardasPapelId: guardasPapelId,
|
guardasPapelId: guardasPapelId,
|
||||||
guardasGramaje: guardasGramaje,
|
guardasGramaje: guardasGramaje,
|
||||||
@ -1142,7 +1176,7 @@ class PresupuestoCliente {
|
|||||||
|
|
||||||
this.formData.cubierta.tipoCubierta = data.tipoCubierta;
|
this.formData.cubierta.tipoCubierta = data.tipoCubierta;
|
||||||
this.formData.cubierta.solapas = data.solapas;
|
this.formData.cubierta.solapas = data.solapas;
|
||||||
this.formData.cubierta.tamanioSolapas = data.tamanioSolapas;
|
this.formData.cubierta.tamanioSolapasCubierta = data.tamanioSolapasCubierta;
|
||||||
this.formData.cubierta.cubiertaCaras = data.cubiertaCaras;
|
this.formData.cubierta.cubiertaCaras = data.cubiertaCaras;
|
||||||
this.formData.cubierta.guardasPapelId = data.guardasPapelId;
|
this.formData.cubierta.guardasPapelId = data.guardasPapelId;
|
||||||
this.formData.cubierta.guardasGramaje = data.guardasGramaje;
|
this.formData.cubierta.guardasGramaje = data.guardasGramaje;
|
||||||
@ -1219,7 +1253,7 @@ class PresupuestoCliente {
|
|||||||
$(`.solapas-cubierta#con-solapas`).addClass('selected');
|
$(`.solapas-cubierta#con-solapas`).addClass('selected');
|
||||||
this.divSolapasCubierta.removeClass('d-none');
|
this.divSolapasCubierta.removeClass('d-none');
|
||||||
this.carasImpresionCubierta.val(this.formData.cubierta.cubiertaCaras);
|
this.carasImpresionCubierta.val(this.formData.cubierta.cubiertaCaras);
|
||||||
this.tamanioSolapasCubierta.val(this.formData.cubierta.tamanioSolapas);
|
this.tamanioSolapasCubierta.val(this.formData.cubierta.tamanioSolapasCubierta);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.carasImpresionCubierta.val(this.formData.cubierta.cubiertaCaras);
|
this.carasImpresionCubierta.val(this.formData.cubierta.cubiertaCaras);
|
||||||
@ -1354,13 +1388,25 @@ class PresupuestoCliente {
|
|||||||
this.#changeTab('pills-seleccion-tirada');
|
this.#changeTab('pills-seleccion-tirada');
|
||||||
this.summaryTableExtras.addClass('d-none');
|
this.summaryTableExtras.addClass('d-none');
|
||||||
} else {
|
} else {
|
||||||
//this.#changeTab('pills-finalizar');
|
this.#changeTab('pills-resumen');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Eventos para el resumen
|
// Eventos para el resumen
|
||||||
$(document).on('change', '.service-checkbox', (e) => {
|
$(document).on('change', '.service-checkbox', (e) => {
|
||||||
|
|
||||||
|
const $target = $(e.currentTarget);
|
||||||
|
|
||||||
|
if ($target.prop('checked')) {
|
||||||
|
this.formData.servicios.servicios.push($target.val());
|
||||||
|
} else {
|
||||||
|
const index = this.formData.servicios.servicios.indexOf($target.val());
|
||||||
|
if (index > -1) {
|
||||||
|
this.formData.servicios.servicios.splice(index, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
Summary.updateExtras();
|
Summary.updateExtras();
|
||||||
|
this.#cacheFormData();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1372,14 +1418,44 @@ class PresupuestoCliente {
|
|||||||
|
|
||||||
this.divExtras.addClass('animate-fadeInUpBounce');
|
this.divExtras.addClass('animate-fadeInUpBounce');
|
||||||
for (const extra of servicios) {
|
for (const extra of servicios) {
|
||||||
|
if (this.formData.servicios.servicios.includes(extra.id) && !extra.checked) {
|
||||||
|
extra.checked = true;
|
||||||
|
if (extra.id === "marcapaginas" || extra.id === "maquetacion") {
|
||||||
|
extra.price = extra.id === "marcapaginas" ?
|
||||||
|
this.formData.servicios.datosMarcapaginas.resultado.precio :
|
||||||
|
this.formData.servicios.datosMaquetacion.resultado.precio;
|
||||||
|
extra.priceUnit = this.divExtras.data('currency');
|
||||||
|
}
|
||||||
|
}
|
||||||
const item = new ServiceOptionCard(extra);
|
const item = new ServiceOptionCard(extra);
|
||||||
this.divExtras.append(item.render());
|
this.divExtras.append(item.render());
|
||||||
|
if (item.checked) {
|
||||||
|
if (!this.formData.servicios.servicios.includes(extra.id)) {
|
||||||
|
this.formData.servicios.servicios.push(extra.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.#cacheFormData();
|
||||||
Summary.updateExtras();
|
Summary.updateExtras();
|
||||||
}
|
}
|
||||||
|
/******************************
|
||||||
|
* END EXTRAS
|
||||||
|
******************************/
|
||||||
|
|
||||||
|
|
||||||
|
/******************************
|
||||||
|
* EXTRAS
|
||||||
|
******************************/
|
||||||
|
#initResumen() {
|
||||||
|
|
||||||
|
$(document).on('click', '.btn-change-tab-resumen', (e) => {
|
||||||
|
const id = e.currentTarget.id;
|
||||||
|
if (id === 'btn-prev-resumen') {
|
||||||
|
this.#changeTab('pills-extras');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
/******************************
|
/******************************
|
||||||
* END EXTRAS
|
* END EXTRAS
|
||||||
******************************/
|
******************************/
|
||||||
|
|||||||
@ -3,10 +3,12 @@ import { formateaMoneda } from "../utils.js";
|
|||||||
|
|
||||||
|
|
||||||
$(document).on('change', '#maquetacion', function (e) {
|
$(document).on('change', '#maquetacion', function (e) {
|
||||||
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
if ($('#maquetacion').is(':checked')) {
|
if ($('#maquetacion').is(':checked')) {
|
||||||
$.get("/presupuesto/public/maquetacion/form", function (data) {
|
$.get("/presupuesto/public/maquetacion/form", function (data) {
|
||||||
$("#maquetacionModalBody").html(data);
|
$("#maquetacionModalBody").html(data);
|
||||||
|
loadMaquetacionData();
|
||||||
$("#maquetacionModal").modal("show");
|
$("#maquetacionModal").modal("show");
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@ -18,7 +20,9 @@ $(document).on('change', '#maquetacion', function (e) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
$(document).on("submit", "#maquetacionForm", function (e) {
|
$(document).on("submit", "#maquetacionForm", function (e) {
|
||||||
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
const $form = $(this);
|
const $form = $(this);
|
||||||
@ -34,16 +38,15 @@ $(document).on("submit", "#maquetacionForm", function (e) {
|
|||||||
const modal = bootstrap.Modal.getInstance(modalEl) || new bootstrap.Modal(modalEl);
|
const modal = bootstrap.Modal.getInstance(modalEl) || new bootstrap.Modal(modalEl);
|
||||||
modal.hide();
|
modal.hide();
|
||||||
|
|
||||||
|
|
||||||
const resumenHtml = `
|
const resumenHtml = `
|
||||||
<div class="text-start">
|
<div class="text-start">
|
||||||
<p>${json.language.num_paginas_estimadas || 'Páginas calculadas'}: ${json.numPaginasEstimadas ?? "-"}</p>
|
<p>${json.language.num_paginas_estimadas || 'Páginas calculadas'}: ${json.numPaginasEstimadas ?? "-"}</p>
|
||||||
<p>${json.language.precio_por_pagina_estimado || 'Precio por página estimado'}: ${formateaMoneda(json.precioPaginaEstimado) || "-"}</p>
|
<p>${json.language.precio_por_pagina_estimado || 'Precio por página estimado'}: ${formateaMoneda(json.precioPaginaEstimado) || "-"}</p>
|
||||||
<hr class="my-2">
|
<hr class="my-2">
|
||||||
${json.precio ?
|
${json.precio ?
|
||||||
`<h3 class="mb-0"><strong>Precio:</strong> ${formateaMoneda(json.precio)}</h3>` : ""}
|
`<h3 class="mb-0"><strong>Precio:</strong> ${formateaMoneda(json.precio)}</h3>` : ""}
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
title: json.language.presupuesto_maquetacion || 'Presupuesto Maquetación',
|
title: json.language.presupuesto_maquetacion || 'Presupuesto Maquetación',
|
||||||
@ -66,6 +69,13 @@ $(document).on("submit", "#maquetacionForm", function (e) {
|
|||||||
$('label[for="maquetacion"] .service-price')
|
$('label[for="maquetacion"] .service-price')
|
||||||
.text(formateaMoneda(json.precio));
|
.text(formateaMoneda(json.precio));
|
||||||
Summary.updateExtras();
|
Summary.updateExtras();
|
||||||
|
|
||||||
|
// guardamos los datos del formulario en sessionStorage
|
||||||
|
const stored = JSON.parse(sessionStorage.getItem("formData"));
|
||||||
|
stored.servicios.datosMaquetacion.resultado.num_paginas_estimadas = json.numPaginasEstimadas;
|
||||||
|
stored.servicios.datosMaquetacion.resultado.precio_pagina_estimado = json.precioPaginaEstimado;
|
||||||
|
stored.servicios.datosMaquetacion.resultado.precio = json.precio;
|
||||||
|
sessionStorage.setItem("formData", JSON.stringify(stored));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const calcularStr = $('#div-extras').data('language-calcular');
|
const calcularStr = $('#div-extras').data('language-calcular');
|
||||||
@ -103,8 +113,52 @@ $(document).on("submit", "#maquetacionForm", function (e) {
|
|||||||
$(document).on('hidden.bs.modal', '#maquetacionModal', function () {
|
$(document).on('hidden.bs.modal', '#maquetacionModal', function () {
|
||||||
|
|
||||||
const calcularStr = $('#div-extras').data('language-calcular');
|
const calcularStr = $('#div-extras').data('language-calcular');
|
||||||
$('#maquetacion').prop('checked', false);
|
|
||||||
$('#maquetacion').data('price', calcularStr);
|
$('#maquetacion').data('price', calcularStr);
|
||||||
$('label[for="maquetacion"] .service-price').text(calcularStr);
|
$('label[for="maquetacion"] .service-price').text(calcularStr);
|
||||||
|
$('#maquetacion').prop('checked', false).trigger('change');
|
||||||
|
|
||||||
|
Summary.updateExtras();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
$(document).on('change', '.maquetacion-item', () => {
|
||||||
|
|
||||||
|
saveMaquetacionData();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
function loadMaquetacionData() {
|
||||||
|
|
||||||
|
const stored = JSON.parse(sessionStorage.getItem("formData")).servicios.datosMaquetacion;
|
||||||
|
$('#num-caracteres').val(stored.num_caracteres);
|
||||||
|
$('#formato-maquetacion').val(stored.formato_maquetacion);
|
||||||
|
$('#cuerpo-texto').val(stored.cuerpo_texto);
|
||||||
|
$('#num-columnas').val(stored.num_columnas);
|
||||||
|
$('#num-tablas').val(stored.num_tablas);
|
||||||
|
$('#num-fotos').val(stored.num_fotos);
|
||||||
|
$('#correccion-ortotipografica').prop('checked', stored.correccion_ortotipografica);
|
||||||
|
$('#texto-mecanografiado').prop('checked', stored.texto_mecanografiado);
|
||||||
|
$('#disenio-portada').prop('checked', stored.disenio_portada);
|
||||||
|
$('#epub').prop('checked', stored.epub);
|
||||||
|
|
||||||
|
Summary.updateExtras();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function saveMaquetacionData() {
|
||||||
|
|
||||||
|
const stored = JSON.parse(sessionStorage.getItem("formData"));
|
||||||
|
stored.servicios.datosMaquetacion.num_caracteres = parseInt($('#num-caracteres').val()) || 0;
|
||||||
|
stored.servicios.datosMaquetacion.formato_maquetacion = $('#formato-maquetacion').val() || 'A5';
|
||||||
|
stored.servicios.datosMaquetacion.cuerpo_texto = $('#cuerpo-texto').val() || 'medium';
|
||||||
|
stored.servicios.datosMaquetacion.num_columnas = parseInt($('#num-columnas').val()) || 1;
|
||||||
|
stored.servicios.datosMaquetacion.num_tablas = parseInt($('#num-tablas').val()) || 0;
|
||||||
|
stored.servicios.datosMaquetacion.num_fotos = parseInt($('#num-fotos').val()) || 0;
|
||||||
|
stored.servicios.datosMaquetacion.correccion_ortotipografica = $('#correccion-ortotipografica').is(':checked');
|
||||||
|
stored.servicios
|
||||||
|
.datosMaquetacion.texto_mecanografiado = $('#texto-mecanografiado').is(':checked');
|
||||||
|
stored.servicios.datosMaquetacion.disenio_portada = $('#disenio-portada').is(':checked');
|
||||||
|
stored.servicios.datosMaquetacion.epub = $('#epub').is(':checked');
|
||||||
|
sessionStorage.setItem("formData", JSON.stringify(stored));
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import * as Summary from "./summary.js";
|
import * as Summary from "./summary.js";
|
||||||
import { formateaMoneda, formateaMoneda6Decimales } from "../utils.js";
|
import { formateaMoneda } from "../utils.js";
|
||||||
|
|
||||||
$(document).on('change', '#marcapaginas', function (e) {
|
$(document).on('change', '#marcapaginas', function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
@ -7,8 +7,11 @@ $(document).on('change', '#marcapaginas', function (e) {
|
|||||||
$.get("/presupuesto/public/marcapaginas/form", function (data) {
|
$.get("/presupuesto/public/marcapaginas/form", function (data) {
|
||||||
$("#marcapaginasModalBody").html(data);
|
$("#marcapaginasModalBody").html(data);
|
||||||
|
|
||||||
|
loadMarcapaginasData();
|
||||||
|
|
||||||
// init marcapaginas form
|
// init marcapaginas form
|
||||||
filtrarAcabados();
|
filtrarAcabados();
|
||||||
|
|
||||||
$("#marcapaginasModal").modal("show");
|
$("#marcapaginasModal").modal("show");
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@ -39,7 +42,7 @@ $(document).on("submit", "#marcapaginasForm", function (e) {
|
|||||||
|
|
||||||
const resumenHtml = `
|
const resumenHtml = `
|
||||||
<div class="text-start">
|
<div class="text-start">
|
||||||
<p>${json.language.precio_unidad || 'Precio por unidad'}: ${formateaMoneda6Decimales(json.precio_unitario) || "-"}</p>
|
<p>${json.language.precio_unidad || 'Precio por unidad'}: ${formateaMoneda(json.precio_unitario, 6) || "-"}</p>
|
||||||
<h3 class="mb-0">${json.language.precio_total || 'Precio total'}: ${formateaMoneda(json.precio_total) || "-"}</h3>
|
<h3 class="mb-0">${json.language.precio_total || 'Precio total'}: ${formateaMoneda(json.precio_total) || "-"}</h3>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
@ -65,6 +68,12 @@ $(document).on("submit", "#marcapaginasForm", function (e) {
|
|||||||
$('label[for="marcapaginas"] .service-price')
|
$('label[for="marcapaginas"] .service-price')
|
||||||
.text(formateaMoneda(json.precio_total));
|
.text(formateaMoneda(json.precio_total));
|
||||||
Summary.updateExtras();
|
Summary.updateExtras();
|
||||||
|
|
||||||
|
// guardamos los datos del formulario en sessionStorage
|
||||||
|
const stored = JSON.parse(sessionStorage.getItem("formData"));
|
||||||
|
stored.servicios.datosMarcapaginas.resultado.precio_unitario = json.precio_unitario;
|
||||||
|
stored.servicios.datosMarcapaginas.resultado.precio = json.precio_total;
|
||||||
|
sessionStorage.setItem("formData", JSON.stringify(stored));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const calcularStr = $('#div-extras').data('language-calcular');
|
const calcularStr = $('#div-extras').data('language-calcular');
|
||||||
@ -108,9 +117,10 @@ $(document).on("change", "#caras-impresion", function (e) {
|
|||||||
$(document).on('hidden.bs.modal', '#marcapaginasModal', function () {
|
$(document).on('hidden.bs.modal', '#marcapaginasModal', function () {
|
||||||
|
|
||||||
const calcularStr = $('#div-extras').data('language-calcular');
|
const calcularStr = $('#div-extras').data('language-calcular');
|
||||||
$('#marcapaginas').prop('checked', false);
|
|
||||||
$('#marcapaginas').data('price', calcularStr);
|
$('#marcapaginas').data('price', calcularStr);
|
||||||
$('label[for="marcapaginas"] .service-price').text(calcularStr);
|
$('label[for="marcapaginas"] .service-price').text(calcularStr);
|
||||||
|
$('#marcapaginas').prop('checked', false).trigger('change');
|
||||||
|
Summary.updateExtras();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@ -139,5 +149,35 @@ function filtrarAcabados() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$(document).on('change', '.marcapaginas-item', () => {
|
||||||
|
|
||||||
|
saveMarcapaginasData();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
function loadMarcapaginasData() {
|
||||||
|
|
||||||
|
const stored = JSON.parse(sessionStorage.getItem("formData")).servicios.datosMarcapaginas;
|
||||||
|
$('#marcapaginas-tirada').val(stored.marcapaginas_tirada);
|
||||||
|
$('#tamanio-marcapaginas').val(stored.tamanio_marcapaginas);
|
||||||
|
$('#caras-impresion').val(stored.caras_impresion);
|
||||||
|
$('#papel-marcapaginas').val(stored.papel_marcapaginas);
|
||||||
|
$('#gramaje-marcapaginas').val(stored.gramaje_marcapaginas);
|
||||||
|
$('#acabado-marcapaginas').val(stored.acabado_marcapaginas);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function saveMarcapaginasData() {
|
||||||
|
|
||||||
|
const stored = JSON.parse(sessionStorage.getItem("formData"));
|
||||||
|
stored.servicios.datosMarcapaginas.marcapaginas_tirada = parseInt($('#marcapaginas-tirada').val()) || 100;
|
||||||
|
stored.servicios.datosMarcapaginas.tamanio_marcapaginas = $('#tamanio-marcapaginas').val() || '_50x140_';
|
||||||
|
stored.servicios.datosMarcapaginas.caras_impresion = $('#caras-impresion').val() || 'una_cara';
|
||||||
|
stored.servicios.datosMarcapaginas.papel_marcapaginas = $('#papel-marcapaginas').val() || 'cartulina_grafica';
|
||||||
|
stored.servicios.datosMarcapaginas.gramaje_marcapaginas = parseInt($('#gramaje-marcapaginas').val()) || 300;
|
||||||
|
stored.servicios.datosMarcapaginas.acabado_marcapaginas = $('#acabado-marcapaginas').val() || 'ninguno';
|
||||||
|
sessionStorage.setItem("formData", JSON.stringify(stored));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
import {formateaMoneda, isNumber} from '../utils.js';
|
||||||
|
|
||||||
class ServiceOptionCard {
|
class ServiceOptionCard {
|
||||||
|
|
||||||
constructor({ id, title, description = '', price = '', priceUnit = '', checked = false, allowChange = true, ribbonText }) {
|
constructor({ id, title, description = '', price = '', priceUnit = '', checked = false, allowChange = true, ribbonText }) {
|
||||||
@ -23,7 +25,7 @@ class ServiceOptionCard {
|
|||||||
${ribbonHtml}
|
${ribbonHtml}
|
||||||
<h5 class="service-title mb-1">${this.title}</h5>
|
<h5 class="service-title mb-1">${this.title}</h5>
|
||||||
<p class="service-desc mb-1 small">${this.description}</p>
|
<p class="service-desc mb-1 small">${this.description}</p>
|
||||||
<h4 class="service-price fw-semibold mt-2 h4 mb-0">${this.price} ${this.priceUnit}</h4>
|
<h4 class="service-price fw-semibold mt-2 h4 mb-0">${isNumber(this.price) ? formateaMoneda(this.price, 2, this.locale) : this.price}</h4>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
`);
|
`);
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
|
import { formateaMoneda, formateaNumero } from "../utils.js";
|
||||||
|
|
||||||
// ===== Clase =====
|
// ===== Clase =====
|
||||||
class TiradaCard {
|
class TiradaCard {
|
||||||
constructor({ id, titulo, unidades, precioUnidad, precioTotal, selected = false, moneda = '€', name = 'tirada',
|
constructor({ id, titulo, unidades, precioUnidad, precioTotal, selected = false, name = 'tirada',
|
||||||
labels = {}, locale = (document.documentElement.lang || navigator.language || 'es-ES')
|
labels = {}, locale = (document.documentElement.lang || navigator.language || 'es-ES')
|
||||||
}) {
|
}) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
@ -9,7 +11,6 @@ class TiradaCard {
|
|||||||
this.precioUnidad = precioUnidad;
|
this.precioUnidad = precioUnidad;
|
||||||
this.precioTotal = precioTotal;
|
this.precioTotal = precioTotal;
|
||||||
this.selected = selected;
|
this.selected = selected;
|
||||||
this.moneda = moneda;
|
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.locale = locale;
|
this.locale = locale;
|
||||||
this.labels = Object.assign({
|
this.labels = Object.assign({
|
||||||
@ -22,16 +23,10 @@ class TiradaCard {
|
|||||||
this.$container = null; // se establece al renderizar
|
this.$container = null; // se establece al renderizar
|
||||||
}
|
}
|
||||||
|
|
||||||
#formatMoneyES(value, decimals = 2) {
|
|
||||||
return new Intl.NumberFormat(this.locale, {
|
|
||||||
minimumFractionDigits: decimals,
|
|
||||||
maximumFractionDigits: decimals
|
|
||||||
}).format(Number(value));
|
|
||||||
}
|
|
||||||
|
|
||||||
#title() {
|
#title() {
|
||||||
if (this.titulo) return this.titulo;
|
if (this.titulo) return this.titulo;
|
||||||
if (this.unidades != null) return `${this.unidades} ${this.labels.units}`;
|
if (this.unidades != null) return `${formateaNumero({valor: this.unidades, locale: this.locale, digits: 0})} ${this.labels.units}`;
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -46,11 +41,11 @@ class TiradaCard {
|
|||||||
<div class="title">${this.#title()}</div>
|
<div class="title">${this.#title()}</div>
|
||||||
|
|
||||||
<div class="per muted">${this.labels.perUnit}</div>
|
<div class="per muted">${this.labels.perUnit}</div>
|
||||||
<div class="price-big">${this.#formatMoneyES(this.precioUnidad, 4)} ${this.moneda}</div>
|
<div class="price-big">${formateaMoneda(this.precioUnidad, 4, this.locale)}</div>
|
||||||
|
|
||||||
<div class="price-row">
|
<div class="price-row">
|
||||||
<div class="muted">${this.labels.total}</div>
|
<div class="muted">${this.labels.total}</div>
|
||||||
<div class="price-total fw-bold">${this.#formatMoneyES(this.precioTotal, 2)} ${this.moneda}</div>
|
<div class="price-total fw-bold">${formateaMoneda(this.precioTotal, 2, this.locale)}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button type="button" class="btn btn-select-tirada">${this.labels.select}</button>
|
<button type="button" class="btn btn-select-tirada">${this.labels.select}</button>
|
||||||
|
|||||||
@ -1,26 +1,40 @@
|
|||||||
function formateaMoneda(valor) {
|
function formateaMoneda(valor, digits = 2, locale = 'es-ES', currency = 'EUR') {
|
||||||
try {
|
try {
|
||||||
return new Intl.NumberFormat('es-ES', { style: 'currency', currency: 'EUR' }).format(valor);
|
return new Intl.NumberFormat(locale, { style: 'currency', currency, minimumFractionDigits: digits, useGrouping: true }).format(valor);
|
||||||
} catch {
|
} catch {
|
||||||
return valor;
|
return valor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
export { formateaMoneda };
|
export { formateaMoneda };
|
||||||
|
|
||||||
function formateaMoneda4Decimales(valor) {
|
|
||||||
try {
|
|
||||||
return new Intl.NumberFormat('es-ES', { style: 'currency', currency: 'EUR', minimumFractionDigits: 4 }).format(valor);
|
|
||||||
} catch {
|
|
||||||
return valor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export { formateaMoneda4Decimales };
|
|
||||||
|
|
||||||
function formateaMoneda6Decimales(valor) {
|
function formateaNumero({
|
||||||
try {
|
valor,
|
||||||
return new Intl.NumberFormat('es-ES', { style: 'currency', currency: 'EUR', minimumFractionDigits: 6 }).format(valor);
|
digits = 2,
|
||||||
} catch {
|
style = 'decimal',
|
||||||
return valor;
|
locale = 'es-ES',
|
||||||
|
currency = 'EUR'
|
||||||
|
}) {
|
||||||
|
const n = Number(valor);
|
||||||
|
if (!Number.isFinite(n)) return valor;
|
||||||
|
|
||||||
|
const opts = {
|
||||||
|
useGrouping: true,
|
||||||
|
minimumFractionDigits: digits,
|
||||||
|
maximumFractionDigits: digits,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (style === 'currency') {
|
||||||
|
opts.style = 'currency';
|
||||||
|
opts.currency = currency;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return new Intl.NumberFormat(locale, opts).format(n);
|
||||||
}
|
}
|
||||||
export { formateaMoneda6Decimales };
|
export { formateaNumero };
|
||||||
|
|
||||||
|
|
||||||
|
function isNumber(value) {
|
||||||
|
return !isNaN(Number(value)) && value.trim() !== '';
|
||||||
|
}
|
||||||
|
export { isNumber };
|
||||||
@ -24,7 +24,7 @@
|
|||||||
<label for="titulo" class="form-label" th:text="#{presupuesto.titulo}">
|
<label for="titulo" class="form-label" th:text="#{presupuesto.titulo}">
|
||||||
>Título*</label>
|
>Título*</label>
|
||||||
<input type="text" class="form-control datos-generales-data" id="titulo" placeholder=""
|
<input type="text" class="form-control datos-generales-data" id="titulo" placeholder=""
|
||||||
value="">
|
th:value="${presupuesto?.titulo} ?: ''">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -33,13 +33,13 @@
|
|||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label for="autor" class="form-label" th:text="#{presupuesto.autor}">Autor</label>
|
<label for="autor" class="form-label" th:text="#{presupuesto.autor}">Autor</label>
|
||||||
<input type="text" class="form-control datos-generales-data" id="autor" value="">
|
<input type="text" class="form-control datos-generales-data" id="autor" th:value="${presupuesto?.autor} ?: ''">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label for="isbn" class="form-label" th:text="#{presupuesto.isbn}">ISBN</label>
|
<label for="isbn" class="form-label" th:text="#{presupuesto.isbn}">ISBN</label>
|
||||||
<input type="text" class="form-control datos-generales-data" id="isbn" value="">
|
<input type="text" class="form-control datos-generales-data" id="isbn" th:value="${presupuesto?.isbn} ?: ''" >
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ribbon-content mt-4">
|
<div class="ribbon-content mt-4">
|
||||||
<div id="div-extras" class="hstack gap-2 justify-content-center flex-wrap">
|
<div id="div-extras" class="hstack gap-2 justify-content-center flex-wrap" th:data-currency="#{app.currency-symbol}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -24,7 +24,7 @@
|
|||||||
</button>
|
</button>
|
||||||
<button id="btn-next-extras" type="button"
|
<button id="btn-next-extras" type="button"
|
||||||
class="btn btn-secondary d-flex align-items-center btn-change-tab-extras">
|
class="btn btn-secondary d-flex align-items-center btn-change-tab-extras">
|
||||||
<span><b th:text="#{presupuesto.calcular-presupuesto}">Calcular presupuesto</b></span>
|
<span><b th:text="#{presupuesto.resumen}">Resumen</b></span>
|
||||||
<i class="ri-arrow-right-circle-line fs-16 ms-2"></i>
|
<i class="ri-arrow-right-circle-line fs-16 ms-2"></i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -0,0 +1,24 @@
|
|||||||
|
<div class="animate-fadeInUpBounce">
|
||||||
|
|
||||||
|
<!-- 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.resumen}">Resumen
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ribbon-content mt-4">
|
||||||
|
<div id="div-extras" class="hstack gap-2 justify-content-center flex-wrap">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Ribbon Shape -->
|
||||||
|
|
||||||
|
<div class="d-flex justify-content-between align-items-center mt-4 w-100">
|
||||||
|
<button id="btn-prev-resumen" type="button"
|
||||||
|
class="btn btn-light d-flex align-items-center btn-change-tab-resumen">
|
||||||
|
<i class=" ri-arrow-left-circle-line label-icon align-middle fs-16 me-2"></i>
|
||||||
|
<span th:text="#{presupuesto.volver-extras}">Volver a extras</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@ -61,6 +61,15 @@
|
|||||||
<label th:text="#{presupuesto.extras}">Extras</label>
|
<label th:text="#{presupuesto.extras}">Extras</label>
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<button class="nav-link fs-15 p-3" id="pills-resumen-tab"
|
||||||
|
data-bs-target="#pills-resumen" type="button" role="tab"
|
||||||
|
aria-controls="pills-resumen" 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.resumen}">Resumen</label>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -106,6 +115,13 @@
|
|||||||
</div>
|
</div>
|
||||||
<!-- end tab pane -->
|
<!-- end tab pane -->
|
||||||
|
|
||||||
|
<div class="tab-pane fade" id="pills-resumen" role="tabpanel"
|
||||||
|
aria-labelledby="pills-resumen-tab">
|
||||||
|
|
||||||
|
<div th:include="~{imprimelibros/presupuestos/presupuestador-items/_resumen.html}"></div>
|
||||||
|
</div>
|
||||||
|
<!-- end tab pane -->
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- end tab content -->
|
<!-- end tab content -->
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@ -2,13 +2,13 @@
|
|||||||
<form id="maquetacionForm" novalidate th:action="@{/presupuesto/public/maquetacion}" th:object="${presupuestoMaquetacion}" method="get">
|
<form id="maquetacionForm" novalidate th:action="@{/presupuesto/public/maquetacion}" th:object="${presupuestoMaquetacion}" method="get">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label th:text="#{presupuesto.maquetacion.num-caracteres}" for="num-caracteres">Número de caracteres</label>
|
<label th:text="#{presupuesto.maquetacion.num-caracteres}" for="num-caracteres">Número de caracteres</label>
|
||||||
<input type="number" class="form-control" id="num-caracteres" th:field="*{numCaracteres}" min="1" required>
|
<input type="number" class="form-control maquetacion-item" id="num-caracteres" th:field="*{numCaracteres}" min="1" required>
|
||||||
<div class="invalid-feedback"></div>
|
<div class="invalid-feedback"></div>
|
||||||
<label th:text="#{presupuesto.maquetacion.num-caracteres-descripcion}" class="form-text text-muted"></label>
|
<label th:text="#{presupuesto.maquetacion.num-caracteres-descripcion}" class="form-text text-muted"></label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label th:text="#{presupuesto.maquetacion.formato}" for="formato-maquetacion">Formato</label>
|
<label th:text="#{presupuesto.maquetacion.formato}" for="formato-maquetacion">Formato</label>
|
||||||
<select class="form-control" id="formato-maquetacion" th:field="*{formato}" required>
|
<select class="form-control maquetacion-item" id="formato-maquetacion" th:field="*{formato}" required>
|
||||||
<option value="A5" selected>A5</option>
|
<option value="A5" selected>A5</option>
|
||||||
<option value="_17x24_">170x240 mm</option>
|
<option value="_17x24_">170x240 mm</option>
|
||||||
<option value="A4">A4</option>
|
<option value="A4">A4</option>
|
||||||
@ -17,52 +17,52 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label th:text="#{presupuesto.maquetacion.cuerpo-texto}" for="cuerpo-texto">Cuerpo de texto</label>
|
<label th:text="#{presupuesto.maquetacion.cuerpo-texto}" for="cuerpo-texto">Cuerpo de texto</label>
|
||||||
<select class="form-control" id="cuerpo-texto" th:field="*{cuerpoTexto}" required>
|
<select class="form-control maquetacion-item" id="cuerpo-texto" th:field="*{cuerpoTexto}" required>
|
||||||
<option th:text="#{presupuesto.maquetacion.cuerpo-texto-pequeño}" value="small"></option>
|
<option th:text="#{presupuesto.maquetacion.cuerpo-texto-pequeño}" value="small"></option>
|
||||||
<option th:text="#{presupuesto.maquetacion.cuerpo-texto-medio}" value="medium" selected>Medio (12pt)
|
<option th:text="#{presupuesto.maquetacion.cuerpo-texto-medio}" value="medium" selected>Medio (12pt)
|
||||||
</option>
|
</option>
|
||||||
<option th:text="#{presupuesto.maquetacion.cuerpo-texto-grande}" value="large">Grande</option>
|
<option th:text="#{presupuesto.maquetacion.cuerpo-texto-grande}" value="big">Grande</option>
|
||||||
</select>
|
</select>
|
||||||
<label th:text="#{presupuesto.maquetacion.cuerpo-texto-descripcion}" class="form-text text-muted"></label>
|
<label th:text="#{presupuesto.maquetacion.cuerpo-texto-descripcion}" class="form-text text-muted"></label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label th:text="#{presupuesto.maquetacion.num-columnas}" for="num-columnas">Número de columnas</label>
|
<label th:text="#{presupuesto.maquetacion.num-columnas}" for="num-columnas">Número de columnas</label>
|
||||||
<input type="number" class="form-control" id="num-columnas" th:field="*{numColumnas}" min="1" required>
|
<input type="number" class="form-control maquetacion-item" id="num-columnas" th:field="*{numColumnas}" min="1" required>
|
||||||
<div class="invalid-feedback"></div>
|
<div class="invalid-feedback"></div>
|
||||||
<label th:text="#{presupuesto.maquetacion.num-columnas-descripcion}" class="form-text text-muted"></label>
|
<label th:text="#{presupuesto.maquetacion.num-columnas-descripcion}" class="form-text text-muted"></label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label th:text="#{presupuesto.maquetacion.num-tablas}" for="num-tablas">Número de tablas</label>
|
<label th:text="#{presupuesto.maquetacion.num-tablas}" for="num-tablas">Número de tablas</label>
|
||||||
<input type="number" class="form-control" id="num-tablas" th:field="*{numTablas}" min="0" required>
|
<input type="number" class="form-control maquetacion-item" id="num-tablas" th:field="*{numTablas}" min="0" required>
|
||||||
<div class="invalid-feedback"></div>
|
<div class="invalid-feedback"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label th:text="#{presupuesto.maquetacion.num-fotos}" for="num-fotos">Número de fotos</label>
|
<label th:text="#{presupuesto.maquetacion.num-fotos}" for="num-fotos">Número de fotos</label>
|
||||||
<input type="number" class="form-control" id="num-fotos" th:field="*{numFotos}" min="0" required>
|
<input type="number" class="form-control maquetacion-item" id="num-fotos" th:field="*{numFotos}" min="0" required>
|
||||||
<div class="invalid-feedback"></div>
|
<div class="invalid-feedback"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check form-switch form-switch-custom mb-3 mt-3">
|
<div class="form-check form-switch form-switch-custom mb-3 mt-3">
|
||||||
<input type="checkbox" class="form-check-input form-switch-custom-primary"
|
<input type="checkbox" class="form-check-input form-switch-custom-primary maquetacion-item"
|
||||||
id="correccion-ortotipografica" name="correccion-ortotipografica"
|
id="correccion-ortotipografica" name="correccion-ortotipografica"
|
||||||
th:field="*{correccionOrtotipografica}">
|
th:field="*{correccionOrtotipografica}">
|
||||||
<label class="form-check-label" for="correccion-ortotipografica">Corrección ortotipográfica</label>
|
<label class="form-check-label" for="correccion-ortotipografica">Corrección ortotipográfica</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check form-switch form-switch-custom mb-3">
|
<div class="form-check form-switch form-switch-custom mb-3">
|
||||||
<input type="checkbox" class="form-check-input form-switch-custom-primary"
|
<input type="checkbox" class="form-check-input form-switch-custom-primary maquetacion-item"
|
||||||
id="texto-mecanografiado" name="texto-mecanografiado" th:field="*{textoMecanografiado}">
|
id="texto-mecanografiado" name="texto-mecanografiado" th:field="*{textoMecanografiado}">
|
||||||
<label for="texto-mecanografiado" class="form-check-label" th:text="#{presupuesto.maquetacion.texto-mecanografiado}">
|
<label for="texto-mecanografiado" class="form-check-label" th:text="#{presupuesto.maquetacion.texto-mecanografiado}">
|
||||||
Texto mecanografiado
|
Texto mecanografiado
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check form-switch form-switch-custom mb-3">
|
<div class="form-check form-switch form-switch-custom mb-3">
|
||||||
<input type="checkbox" class="form-check-input form-switch-custom-primary" id="disenio-portada"
|
<input type="checkbox" class="form-check-input form-switch-custom-primary maquetacion-item" id="disenio-portada"
|
||||||
name="disenio-portada" th:field="*{disenioPortada}">
|
name="disenio-portada" th:field="*{disenioPortada}">
|
||||||
<label for="disenio-portada" class="form-check-label" th:text="#{presupuesto.maquetacion.diseno-portada}">
|
<label for="disenio-portada" class="form-check-label" th:text="#{presupuesto.maquetacion.diseno-portada}">
|
||||||
Diseño de portada
|
Diseño de portada
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check form-switch form-switch-custom">
|
<div class="form-check form-switch form-switch-custom">
|
||||||
<input type="checkbox" class="form-check-input form-switch-custom-primary" id="epub" name="epub"
|
<input type="checkbox" class="form-check-input form-switch-custom-primary maquetacion-item" id="epub" name="epub"
|
||||||
th:field="*{epub}">
|
th:field="*{epub}">
|
||||||
<label for="epub" class="form-check-label" th:text="#{presupuesto.maquetacion.epub}">ePub</label>
|
<label for="epub" class="form-check-label" th:text="#{presupuesto.maquetacion.epub}">ePub</label>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -2,12 +2,12 @@
|
|||||||
<form id="marcapaginasForm" novalidate th:action="@{/presupuesto/public/marcapaginas}" th:object="${presupuestoMarcapaginas}" method="get">
|
<form id="marcapaginasForm" novalidate th:action="@{/presupuesto/public/marcapaginas}" th:object="${presupuestoMarcapaginas}" method="get">
|
||||||
<div class="form-group mb-3">
|
<div class="form-group mb-3">
|
||||||
<label th:text="#{presupuesto.tirada}" for="marcapaginas-tirada">Tirada</label>
|
<label th:text="#{presupuesto.tirada}" for="marcapaginas-tirada">Tirada</label>
|
||||||
<input type="number" class="form-control" id="marcapaginas-tirada" th:field="*{unidades}" min="100" required>
|
<input type="number" class="form-control marcapaginas-item" id="marcapaginas-tirada" th:field="*{unidades}" min="100" required>
|
||||||
<div class="invalid-feedback"></div>
|
<div class="invalid-feedback"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group mb-3">
|
<div class="form-group mb-3">
|
||||||
<label th:text="#{presupuesto.marcapaginas.tamanio}" for="tamanio-maquetacion">Tamaño</label>
|
<label th:text="#{presupuesto.marcapaginas.tamanio}" for="tamanio-marcapaginas">Tamaño</label>
|
||||||
<select class="form-control" id="tamanio-maquetacion" th:field="*{tamanio}" required>
|
<select class="form-control marcapaginas-item" id="tamanio-marcapaginas" th:field="*{tamanio}" required>
|
||||||
<option value="_50x140_" selected>50x140 mm</option>
|
<option value="_50x140_" selected>50x140 mm</option>
|
||||||
<option value="_50x170_">50x170 mm</option>
|
<option value="_50x170_">50x170 mm</option>
|
||||||
<option value="_50x210_">50x210 mm</option>
|
<option value="_50x210_">50x210 mm</option>
|
||||||
@ -15,28 +15,28 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group mb-3">
|
<div class="form-group mb-3">
|
||||||
<label th:text="#{presupuesto.marcapaginas.caras-impresion}" for="caras-impresion">Caras impresión</label>
|
<label th:text="#{presupuesto.marcapaginas.caras-impresion}" for="caras-impresion">Caras impresión</label>
|
||||||
<select class="form-control" id="caras-impresion" th:field="*{carasImpresion}" required>
|
<select class="form-control marcapaginas-item" id="caras-impresion" th:field="*{carasImpresion}" required>
|
||||||
<option th:text="#{presupuesto.marcapaginas.caras-impresion-1}" value="una_cara">Una cara</option>
|
<option th:text="#{presupuesto.marcapaginas.caras-impresion-1}" value="una_cara">Una cara</option>
|
||||||
<option th:text="#{presupuesto.marcapaginas.caras-impresion-2}" value="dos_caras" selected>Dos caras</option>
|
<option th:text="#{presupuesto.marcapaginas.caras-impresion-2}" value="dos_caras" selected>Dos caras</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group mb-3">
|
<div class="form-group mb-3">
|
||||||
<label th:text="#{presupuesto.marcapaginas.papel}" for="papel-marcapaginas">Papel marcapáginas</label>
|
<label th:text="#{presupuesto.marcapaginas.papel}" for="papel-marcapaginas">Papel marcapáginas</label>
|
||||||
<select class="form-control" id="papel-marcapaginas" th:field="*{papel}" required>
|
<select class="form-control marcapaginas-item" id="papel-marcapaginas" th:field="*{papel}" required>
|
||||||
<option th:text="#{presupuesto.marcapaginas.papel.cartulina-grafica}" value="cartulina_grafica">Cartulina gráfica</option>
|
<option th:text="#{presupuesto.marcapaginas.papel.cartulina-grafica}" value="cartulina_grafica">Cartulina gráfica</option>
|
||||||
<option th:text="#{presupuesto.marcapaginas.papel.estucado-mate}" value="estucado_mate" selected>Estucado mate</option>
|
<option th:text="#{presupuesto.marcapaginas.papel.estucado-mate}" value="estucado_mate" selected>Estucado mate</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group mb-3">
|
<div class="form-group mb-3">
|
||||||
<label th:text="#{presupuesto.marcapaginas.gramaje}" for="gramaje-marcapaginas">Gramaje marcapáginas</label>
|
<label th:text="#{presupuesto.marcapaginas.gramaje}" for="gramaje-marcapaginas">Gramaje marcapáginas</label>
|
||||||
<select class="form-control" id="gramaje-marcapaginas" th:field="*{gramaje}" required>
|
<select class="form-control marcapaginas-item" id="gramaje-marcapaginas" th:field="*{gramaje}" required>
|
||||||
<option value="300" selected>300</option>
|
<option value="300" selected>300</option>
|
||||||
<option value="350">350</option>
|
<option value="350">350</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group mb-3">
|
<div class="form-group mb-3">
|
||||||
<label th:text="#{presupuesto.marcapaginas.acabado}" for="acabado-marcapaginas">Acabado marcapáginas</label>
|
<label th:text="#{presupuesto.marcapaginas.acabado}" for="acabado-marcapaginas">Acabado marcapáginas</label>
|
||||||
<select class="form-control" id="acabado-marcapaginas" th:field="*{acabado}" required>
|
<select class="form-control marcapaginas-item" id="acabado-marcapaginas" th:field="*{acabado}" required>
|
||||||
<option class="marcapaginas-1cara marcapaginas-2caras" value="ninguno" th:text="#{presupuesto.marcapaginas.acabado.ninguno}" selected>Sin acabado</option>
|
<option class="marcapaginas-1cara marcapaginas-2caras" value="ninguno" th:text="#{presupuesto.marcapaginas.acabado.ninguno}" selected>Sin acabado</option>
|
||||||
<option class="marcapaginas-1cara" value="plastificado_brillo_1c" th:text="#{presupuesto.marcapaginas.acabado.plastificado-brillo-1c}">Plastificado brillo</option>
|
<option class="marcapaginas-1cara" value="plastificado_brillo_1c" th:text="#{presupuesto.marcapaginas.acabado.plastificado-brillo-1c}">Plastificado brillo</option>
|
||||||
<option class="marcapaginas-1cara" value="plastificado_mate_1c" th:text="#{presupuesto.marcapaginas.acabado.plastificado-mate-1c}">Plastificado mate</option>
|
<option class="marcapaginas-1cara" value="plastificado_mate_1c" th:text="#{presupuesto.marcapaginas.acabado.plastificado-mate-1c}">Plastificado mate</option>
|
||||||
|
|||||||
Reference in New Issue
Block a user