vista de pedidos casi terminada (a falta de acciones delos botones, cambio de estados, etc). Trabajando en el presupuesto para modificar las reimpresiones

This commit is contained in:
2025-11-29 13:42:57 +01:00
parent 9baf880022
commit 58fd4815c6
16 changed files with 2089 additions and 8379 deletions

View File

@ -389,6 +389,19 @@ public class skApiClient {
}
/*
public Map<String, Object> checkPedidoEstado(Long presupuestoId){
try{
}
catch(Exception e){
e.printStackTrace();
return Map.of("error", "Internal Server Error: 1"); // Fallback en caso de error
}
}
*/
/******************
* PRIVATE METHODS
******************/

View File

@ -13,8 +13,9 @@ public class PedidoLinea {
aprobado("pedido.estado.aprobado", 1),
maquetacion("pedido.estado.maquetacion", 2),
haciendo_ferro("pedido.estado.haciendo_ferro", 3),
produccion("pedido.estado.produccion", 4),
cancelado("pedido.estado.cancelado", 5);
ferro_cliente("pedido.estado.ferro_cliente", 4),
produccion("pedido.estado.produccion", 5),
cancelado("pedido.estado.cancelado", 6);
private final String messageKey;
private final int priority;

View File

@ -21,6 +21,7 @@ import com.imprimelibros.erp.datatables.DataTablesParser;
import com.imprimelibros.erp.datatables.DataTablesRequest;
import com.imprimelibros.erp.datatables.DataTablesResponse;
import com.imprimelibros.erp.paises.PaisesService;
import com.imprimelibros.erp.presupuesto.service.PresupuestoService;
import com.imprimelibros.erp.users.UserDao;
import jakarta.persistence.criteria.Join;
@ -28,11 +29,15 @@ import jakarta.persistence.criteria.JoinType;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("/pedidos")
public class PedidosController {
private final PresupuestoService presupuestoService;
private final PedidoRepository repoPedido;
private final PedidoService pedidoService;
private final UserDao repoUser;
@ -40,14 +45,16 @@ public class PedidosController {
private final PedidoLineaRepository repoPedidoLinea;
private final PaisesService paisesService;
public PedidosController(PedidoRepository repoPedido, PedidoService pedidoService, UserDao repoUser, MessageSource messageSource,
PedidoLineaRepository repoPedidoLinea, PaisesService paisesService) {
public PedidosController(PedidoRepository repoPedido, PedidoService pedidoService, UserDao repoUser,
MessageSource messageSource,
PedidoLineaRepository repoPedidoLinea, PaisesService paisesService, PresupuestoService presupuestoService) {
this.repoPedido = repoPedido;
this.pedidoService = pedidoService;
this.repoUser = repoUser;
this.messageSource = messageSource;
this.repoPedidoLinea = repoPedidoLinea;
this.paisesService = paisesService;
this.presupuestoService = presupuestoService;
}
@GetMapping
@ -71,8 +78,7 @@ public class PedidosController {
Long currentUserId = Utils.currentUserId(principal);
List<String> searchable = List.of(
"id"
);
"id");
// Campos ordenables
List<String> orderable = List.of(
@ -171,8 +177,8 @@ public class PedidosController {
@GetMapping("/view/{id}")
public String verPedido(
@PathVariable(name = "id", required = true) Long id,
Model model, Locale locale) {
@PathVariable(name = "id", required = true) Long id,
Model model, Locale locale) {
Boolean isAdmin = Utils.isCurrentUserAdmin();
if (isAdmin) {
@ -182,7 +188,7 @@ public class PedidosController {
}
PedidoDireccion direccionFacturacion = pedidoService.getDireccionFacturacionPedido(id);
if(direccionFacturacion != null){
if (direccionFacturacion != null) {
String paisNombre = paisesService.getPaisNombrePorCode3(direccionFacturacion.getPaisCode3(), locale);
direccionFacturacion.setPaisNombre(paisNombre);
}
@ -192,8 +198,7 @@ public class PedidosController {
List<Map<String, Object>> lineas = pedidoService.getLineas(id, locale);
for (Map<String, Object> linea : lineas) {
List<PedidoDireccion> dirEntrega = pedidoService.getDireccionesEntregaPedidoLinea(
((Number) linea.get("lineaId")).longValue()
);
((Number) linea.get("lineaId")).longValue());
if (dirEntrega != null && !dirEntrega.isEmpty()) {
for (PedidoDireccion direccion : dirEntrega) {
@ -202,11 +207,25 @@ public class PedidosController {
}
}
linea.put("direccionesEntrega", dirEntrega);
}
model.addAttribute("lineas", lineas);
model.addAttribute("id", id);
return "imprimelibros/pedidos/pedidos-view";
}
// -------------------------------------
// Acciones sobre las lineas de pedido
// -------------------------------------
@GetMapping("/linea/{id}/update-status")
public String getMethodName(
@PathVariable(name = "id", required = true) Long id) {
PedidoLinea linea = repoPedidoLinea.findById(id).orElse(null);
if (linea != null) {
Long externalId = linea.getPresupuesto().getProveedorRef2();
}
return new String();
}
}

View File

@ -1357,6 +1357,10 @@ public class PresupuestoService {
return resumen;
}
public Presupuesto findPresupuestoById(Long id) {
return presupuestoRepository.findById(id).orElse(null);
}
// =======================================================================
// Métodos privados
// =======================================================================

View File

@ -20,6 +20,7 @@ checkout.authorization-required=Certifico que tengo los derechos para imprimir l
pedido.estado.aprobado=Aprobado
pedido.estado.maquetacion=Maquetación
pedido.estado.haciendo_ferro=Haciendo ferro
pedido.estado.ferro_cliente=Esperando aprobación de ferro
pedido.estado.produccion=Producción
pedido.estado.terminado=Terminado
pedido.estado.cancelado=Cancelado
@ -28,6 +29,7 @@ pedido.module-title=Pedidos
pedido.pedido=Pedido
pedido.fecha-entrega=Fecha de entrega
pedido.cancelar=Cancelar pedido
pedido.update-estado=Actualizar estado
pedido.shipping-addresses=Direcciones de envío
pedido.prueba=Prueba

View File

@ -37,6 +37,8 @@ presupuesto.tabla.region=Región
presupuesto.tabla.ciudad=Ciudad
presupuesto.tabla.acciones=Acciones
presupuesto.comentario-administrador=Comentarios
# Pestaña datos generales de presupuesto
presupuesto.informacion-libro=Información del libro
presupuesto.datos-generales-descripcion=Datos generales del presupuesto

View File

@ -0,0 +1,36 @@
$(()=>{
const csrfToken = document.querySelector('meta[name="_csrf"]')?.getAttribute('content');
const csrfHeader = document.querySelector('meta[name="_csrf_header"]')?.getAttribute('content');
if (window.$ && csrfToken && csrfHeader) {
$.ajaxSetup({
beforeSend: function (xhr) {
xhr.setRequestHeader(csrfHeader, csrfToken);
}
});
}
const language = document.documentElement.lang || 'es-ES';
$(document).on('click', '.update-status-item', function(){
const lineaId = $(this).data('linea-id');
if(!lineaId){
console.error('No se ha encontrado el ID de la línea del pedido.');
return;
}
// Llamada AJAX para actualizar el estado del pedido
$.ajax({
url: `/imprimelibros/pedidos/linea/${lineaId}/update-status`,
type: 'POST',
success: function(response) {
alert('Estado del pedido actualizado correctamente.');
// Aquí puedes agregar lógica adicional, como actualizar la interfaz de usuario
},
error: function(xhr, status, error) {
console.error('Error al actualizar el estado del pedido:', error);
alert('Hubo un error al actualizar el estado del pedido.');
}
});
});
})

View File

@ -0,0 +1,48 @@
$(() => {
var snowEditor = document.querySelectorAll(".snow-editor");
if (snowEditor) {
Array.from(snowEditor).forEach(function (item) {
var snowEditorData = {};
var issnowEditorVal = item.classList.contains("snow-editor");
if (issnowEditorVal == true) {
snowEditorData.theme = 'snow',
snowEditorData.modules = {
'toolbar': [
[{
'font': []
}, {
'size': []
}],
['bold', 'italic', 'underline', 'strike'],
[{
'color': []
}, {
'background': []
}],
[{
'script': 'super'
}, {
'script': 'sub'
}],
[{
'header': [false, 1, 2, 3, 4, 5, 6]
}, 'blockquote', 'code-block'],
[{
'list': 'ordered'
}, {
'list': 'bullet'
}, {
'indent': '-1'
}, {
'indent': '+1'
}],
['direction', {
'align': []
}]
]
}
}
new Quill(item, snowEditorData);
});
}
});

View File

@ -1,39 +1,40 @@
<div th:fragment="direccionEnvioCard(direccion, pais)" name="direccion"
class="card card border mb-3 direccion-card mx-2">
<div class="card-body">
<div class="card-body position-relative">
<div class="row g-3 align-items-start flex-nowrap">
<div class="col flex-nowrap">
<span class="fs-14 mb-1 d-block text-break" th:text="${direccion.att}"></span>
<span class="text-muted fw-normal text-wrap mb-1 d-block text-break"
th:text="${direccion.direccion}"></span>
<span class="text-muted fw-normal text-wrap mb-1 d-block text-break"
th:text="${direccion.cp} + ', ' + ${direccion.ciudad} + ', (' + ${direccion.provincia} + ')'">
</span>
<span class="text-muted fw-normal d-block text-break" th:text="${pais}"></span>
<span class="text-muted fw-normal d-block text-break"
th:text="#{'direcciones.telefono'} + ': ' + ${direccion.telefono}"></span>
<span class="fw-normal d-block text-break" th:text="${direccion.razonSocial}"></span>
<span class="fw-normal d-block text-break" th:text="${direccion.identificacionFiscal}"></span>
</div>
<div class="col-auto ms-auto text-end">
<th:block th:if="${direccion.unidades != null}">
<div th:if="${direccion.isEjemplarPrueba}">
<span id="units-text" class="mb-2 fw-semibold d-block text-muted text-uppercase"
th:text="#{pedido.prueba}"></span>
</div>
<div th:if="${!direccion.isEjemplarPrueba}">
<span id="units-text" class="mb-2 fw-semibold d-block text-muted text-uppercase"
th:if="${direccion.unidades == 1}"
th:text="|${direccion.unidades} #{cart.shipping.ud}|"></span>
<th:block th:if="${direccion.unidades != null}">
<div class="position-absolute top-0 end-0 mt-2 me-3 text-end">
<div th:if="${direccion.isEjemplarPrueba}">
<span class="mb-2 fw-semibold d-block text-muted text-uppercase"
th:text="#{pedido.prueba}"></span>
</div>
<div th:if="${!direccion.isEjemplarPrueba}">
<!-- singular -->
<span class="mb-2 fw-semibold d-block text-muted text-uppercase"
th:if="${direccion.unidades == 1}"
th:text="|${direccion.unidades} #{cart.shipping.ud}|"></span>
<!-- plural -->
<span id="units-text" class="mb-2 fw-semibold d-block text-muted text-uppercase"
th:unless="${direccion.unidades == 1}"
th:text="|${direccion.unidades} #{cart.shipping.uds}|"></span>
</div>
<!-- plural -->
<span class="mb-2 fw-semibold d-block text-muted text-uppercase"
th:unless="${direccion.unidades == 1}"
th:text="|${direccion.unidades} #{cart.shipping.uds}|"></span>
</div>
</div>
</div>
</th:block>
<!-- TEXTO: usa TODO el ancho -->
<span class="fs-14 mb-1 d-block text-break" th:text="${direccion.att}"></span>
<span class="text-muted fw-normal text-wrap mb-1 d-block text-break"
th:text="${direccion.direccion}"></span>
<span class="text-muted fw-normal text-wrap mb-1 d-block text-break"
th:text="${direccion.cp} + ', ' + ${direccion.ciudad} + ', (' + ${direccion.provincia} + ')'">
</span>
<span class="text-muted fw-normal d-block text-break" th:text="${pais}"></span>
<span class="text-muted fw-normal d-block text-break"
th:text="#{'direcciones.telefono'} + ': ' + ${direccion.telefono}"></span>
<span class="fw-normal d-block text-break" th:text="${direccion.razonSocial}"></span>
<span class="fw-normal d-block text-break" th:text="${direccion.identificacionFiscal}"></span>
</div>
</div>
</div>

View File

@ -1,12 +1,13 @@
<div th:fragment="direccionFacturacionCard(direccion, pais)" name="direccionFacturacion"
class="card card border mb-3 w-auto direccion-facturacion-card d-inline-block ">
class="card card border mb-3 direccion-facturacion-card">
<div class="card-header bg-light">
<span class="fs-16" th:text="#{'direcciones.direccionFacturacion'}"></span>
</div>
<div class="card-body">
<div class="d-flex align-items-start g-3 flex-nowrap w-auto">
<div class="flex-shrink-0">
<img src="/assets/images/billing_address2.gif" style="width: 100px; height: auto;" alt="Billing Address">
<img src="/assets/images/billing_address2.gif" style="width: 100px; height: auto;"
alt="Billing Address">
</div>
<div class="flex-nowrap">
<span class="fs-14 mb-1 d-block text-break" th:text="${direccion.att}"></span>
@ -20,7 +21,7 @@
th:text="#{'direcciones.telefono'} + ': ' + ${direccion.telefono}"></span>
<span class="fw-normal d-block text-break" th:text="${direccion.razonSocial}"></span>
<span class="fw-normal d-block text-break" th:text="${direccion.identificacionFiscal}"></span>
</div>
</div>
</div>
</div>

View File

@ -1,4 +1,5 @@
<div th:fragment="pedido-linea (item, isAdmin)">
<input type="hidden" id="lineaId" th:value="${item.lineaId}" />
<div class="mb-3">
<div class="card p-3 mb-0">
<div class="row g-3 align-items-start">
@ -79,19 +80,24 @@
</div>
<div class="card-body p-3">
<div class="row g-3">
<div class="flex-shrink-0">
<img src="/assets/images/delivery-truck.gif" style="width: 120px; height: auto;"
alt="delivery">
<div class="col-auto d-none d-md-block">
<div class="flex-shrink-0">
<img src="/assets/images/delivery-truck.gif" style="width: 120px; height: auto;"
alt="delivery">
</div>
</div>
<div class="col">
<div class="row g-3">
<div th:each="direccionEnvio : ${item.direccionesEntrega}" class="mb-3 col-xl-4 col-lg-6 col-md-12 col-sm-12">
<div th:insert="~{imprimelibros/direcciones/direccionEnvioCard :: direccionEnvioCard(
direccion=${direccionEnvio},
pais=${direccionEnvio.paisNombre}
)}">
</div>
</div>
</div>
</div>
</div>
<div th:each="direccionEnvio : ${item.direccionesEntrega}" class="mb-3">
<div th:insert="~{imprimelibros/direcciones/direccionEnvioCard :: direccionEnvioCard(
direccion=${direccionEnvio},
pais=${direccionEnvio.paisNombre}
)}">
</div>
</div>
</div>
</div>
</div>
@ -99,14 +105,22 @@
<div class="row align-items-center gy-3">
<div class="col-sm">
<div class="d-flex flex-wrap my-n1">
<!-- Botón eliminar -->
<!-- Botón cancelar -->
<div>
<a href="javascript:void(0);" class="d-block text-body p-1 px-2 delete-item"
th:attr="data-cart-item-id=${item.presupuestoId}">
<a href="javascript:void(0);" class="d-block text-body p-1 px-2 cancel-item"
th:attr="data-linea-id=${item.lineaId}">
<i class="ri-delete-bin-fill text-muted align-bottom me-1"><span
th:text="#{pedido.cancelar}">Cancelar Pedido</span></i>
</a>
</div>
<!-- Actualizar estado-->
<div>
<a href="javascript:void(0);" class="d-block text-body p-1 px-2 update-status-item"
th:attr="data-linea-id=${item.lineaId}">
<i class="ri-refresh-line text-muted align-bottom me-1"><span
th:text="#{pedido.update-estado}">Cancelar Pedido</span></i>
</a>
</div>
</div>
</div>

View File

@ -35,10 +35,22 @@
<div class="container-fluid">
<div th:insert="~{imprimelibros/direcciones/direccionFacturacionCard :: direccionFacturacionCard (direccion=${direccionFacturacion}, pais=${direccionFacturacion != null ? direccionFacturacion.paisNombre : ''})}"></div>
<div class="row">
<div class="col-12 col-md-auto">
<div th:insert="~{imprimelibros/direcciones/direccionFacturacionCard ::
direccionFacturacionCard(
direccion=${direccionFacturacion},
pais=${direccionFacturacion != null ? direccionFacturacion.paisNombre : ''}
)}">
</div>
</div>
</div>
<th:block th:each="linea: ${lineas}">
<div th:insert="~{imprimelibros/pedidos/pedidos-linea :: pedido-linea (item=${linea}, isAdmin=${isAdmin})}"></div>
<div
th:insert="~{imprimelibros/pedidos/pedidos-linea :: pedido-linea (item=${linea}, isAdmin=${isAdmin})}">
</div>
</th:block>
</div>
</div>
@ -63,8 +75,8 @@
<script th:src="@{/assets/libs/datatables/buttons.print.min.js}"></script>
<script th:src="@{/assets/libs/datatables/buttons.colVis.min.js}"></script>
<script type="module" th:src="@{/assets/js/pages/imprimelibros/pedidos/pedidos-common.js}"></script>
<script type="module" th:src="@{/assets/js/pages/imprimelibros/pedidos/pedidos-admin.js}"></script>
<script type="module" th:src="@{/assets/js/pages/imprimelibros/pedidos/pedidos-view.js}"></script>
<script th:if="${isAdmin}" type="module" th:src="@{/assets/js/pages/imprimelibros/pedidos/pedidos-view-admin.js}"></script>
</th:block>
</body>

View File

@ -33,7 +33,8 @@
aria-controls="pills-general-data" aria-selected="true">
<i
class="ri-information-line fs-5 p-1 bg-soft-primary text-primary rounded-circle align-middle me-2"></i>
<label class="fs-13 my-2" th:text="#{presupuesto.datos-generales}">Datos Generales</label>
<label class="fs-13 my-2" th:text="#{presupuesto.datos-generales}">Datos
Generales</label>
</button>
</li>
<li class="nav-item" role="presentation">
@ -60,7 +61,8 @@
aria-controls="pills-seleccion-tirada" aria-selected="false">
<i
class="ri-add-box-line fs-5 p-1 bg-soft-primary text-primary rounded-circle align-middle me-2"></i>
<label class="fs-13 my-2" th:text="#{presupuesto.seleccion-tirada}">Seleccion de tirada</label>
<label class="fs-13 my-2" th:text="#{presupuesto.seleccion-tirada}">Seleccion de
tirada</label>
</button>
</li>
<li class="nav-item" role="presentation">
@ -137,6 +139,31 @@
</div>
<!-- end tab content -->
<div sec:authorize="isAuthenticated() and hasAnyRole('SUPERADMIN','ADMIN')">
<div class="accordion lefticon-accordion custom-accordionwithicon accordion-border-box mt-3"
id="accordionlefticon">
<div class="accordion-item material-shadow">
<h2 class="accordion-header" id="accordionComentario">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#accor_accordionComentario" aria-expanded="false"
aria-controls="accor_accordionComentario"
th:text="#{presupuesto.comentario-administrador}">Comentario
</button>
</h2>
<div id="accor_accordionComentario" class="accordion-collapse collapse"
aria-labelledby="accordionComentario" data-bs-parent="#accordionlefticon">
<div class="accordion-body">
<div class="snow-editor" name="comentario"
th:text="@{presupuesto.comentario}" style=" height: 300px;">
</div> <!-- end Snow-editor-->
</div>
</div>
</div>
</div>
</div>
</form>
</div>
<!-- end card body -->

View File

@ -10,6 +10,8 @@
</th:block>
<th:block layout:fragment="pagecss">
<link th:href="@{/assets/css/presupuestador.css}" rel="stylesheet" />
<link sec:authorize="isAuthenticated() and hasAnyRole('SUPERADMIN','ADMIN')"
th:href="@{/assets/libs/quill/quill.snow.css}" rel="stylesheet" type="text/css" />
</th:block>
</head>
@ -19,62 +21,75 @@
<div th:replace="~{imprimelibros/partials/sidebar :: sidebar}"
sec:authorize="isAuthenticated() and hasAnyRole('SUPERADMIN','ADMIN')">
<th:block layout:fragment="content">
<div th:if="${#authorization.expression('isAuthenticated()')}">
<th:block layout:fragment="content">
<div th:if="${#authorization.expression('isAuthenticated()')}">
<div class="container-fluid">
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/"><i class="ri-home-5-fill"></i></a></li>
<li class="breadcrumb-item"><a href="/presupuesto" th:text="#{presupuesto.title}"></a></li>
<li class="breadcrumb-item active" aria-current="page" th:if="${appMode == 'add'}" th:text="#{presupuesto.add}">
<div class="container-fluid">
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/"><i class="ri-home-5-fill"></i></a></li>
<li class="breadcrumb-item"><a href="/presupuesto" th:text="#{presupuesto.title}"></a></li>
<li class="breadcrumb-item active" aria-current="page" th:if="${appMode == 'add'}"
th:text="#{presupuesto.add}">
Nuevo presupuesto
</li>
<li class="breadcrumb-item active" aria-current="page" th:text="#{presupuesto.editar.title}" th:if="${appMode == 'edit'}">
<li class="breadcrumb-item active" aria-current="page" th:text="#{presupuesto.editar.title}"
th:if="${appMode == 'edit'}">
Editar presupuesto
</li>
</ol>
</nav>
</div>
<div class="container-fluid">
<!-- alert info -->
<div th:if="${appMode} == 'view'" class="alert alert-warning fade show" role="alert">
<i class="ri-information-fill me-1 align-middle"></i>
<span th:text="#{presupuesto.info.presupuestos-anonimos-view}"></span>
</ol>
</nav>
</div>
<div th:insert="~{imprimelibros/presupuestos/presupuestador :: presupuestador}"></div>
</div>
</div>
</th:block>
<div class="container-fluid">
<th:block th:replace="~{theme/partials/vendor-scripts :: scripts}" />
<th:block layout:fragment="pagejs">
<script th:inline="javascript">
window.languageBundle = /*[[${languageBundle}]]*/ {};
</script>
<!-- alert info -->
<div th:if="${appMode} == 'view'" class="alert alert-warning fade show" role="alert">
<i class="ri-information-fill me-1 align-middle"></i>
<span th:text="#{presupuesto.info.presupuestos-anonimos-view}"></span>
</div>
<!-- JS de Buttons y dependencias -->
<div th:if="${appMode} == 'view'">
<script type="module" th:src="@{/assets/js/pages/imprimelibros/presupuestador/wizard-publicos.js}"></script>
</div>
<div th:if="${appMode} == 'edit'">
<script type="module" th:src="@{/assets/js/pages/imprimelibros/presupuestador/wizard-privado.js}"></script>
</div>
<div th:if="${appMode} == 'add'">
<div th:if="${mode} == 'public'">
<script type="module" th:src="@{/assets/js/pages/imprimelibros/presupuestador/wizard-publicos-add.js}"></script>
<div th:insert="~{imprimelibros/presupuestos/presupuestador :: presupuestador}"></div>
</div>
</div>
<div th:if="${mode} != 'public'">
<script type="module" th:src="@{/assets/js/pages/imprimelibros/presupuestador/wizard-privado.js}"></script>
</th:block>
<th:block th:replace="~{theme/partials/vendor-scripts :: scripts}" />
<th:block layout:fragment="pagejs">
<script th:inline="javascript">
window.languageBundle = /*[[${languageBundle}]]*/ {};
</script>
<!-- JS de Buttons y dependencias -->
<div th:if="${appMode} == 'view'">
<script type="module"
th:src="@{/assets/js/pages/imprimelibros/presupuestador/wizard-publicos.js}"></script>
</div>
</div>
<script type="module" th:src="@{/assets/js/pages/imprimelibros/presupuestador/presupuesto-maquetacion.js}"></script>
<script type="module" th:src="@{/assets/js/pages/imprimelibros/presupuestador/presupuesto-marcapaginas.js}"></script>
</th:block>
<div th:if="${appMode} == 'edit'">
<script type="module"
th:src="@{/assets/js/pages/imprimelibros/presupuestador/wizard-privado.js}"></script>
</div>
<div th:if="${appMode} == 'add'">
<div th:if="${mode} == 'public'">
<script type="module"
th:src="@{/assets/js/pages/imprimelibros/presupuestador/wizard-publicos-add.js}"></script>
</div>
<div th:if="${mode} != 'public'">
<script type="module"
th:src="@{/assets/js/pages/imprimelibros/presupuestador/wizard-privado.js}"></script>
</div>
</div>
<script type="module"
th:src="@{/assets/js/pages/imprimelibros/presupuestador/presupuesto-maquetacion.js}"></script>
<script type="module"
th:src="@{/assets/js/pages/imprimelibros/presupuestador/presupuesto-marcapaginas.js}"></script>
<script sec:authorize="isAuthenticated() and hasAnyRole('SUPERADMIN','ADMIN')"
th:src="@{/assets/libs/quill/quill.min.js}"></script>
<script sec:authorize="isAuthenticated() and hasAnyRole('SUPERADMIN','ADMIN')"
th:src="@{/assets/js/pages/imprimelibros/presupuestador/text-editor.js}"></script>
</th:block>
</body>
</html>