mirror of
https://git.imnavajas.es/jjimenez/erp-imprimelibros.git
synced 2026-01-12 16:38:48 +00:00
añadidor los ficheros que faltaban en el commit anterior
This commit is contained in:
@ -0,0 +1,65 @@
|
||||
package com.imprimelibros.erp.config;
|
||||
|
||||
import org.springframework.context.MessageSource;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
|
||||
import org.springframework.web.servlet.LocaleResolver;
|
||||
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
|
||||
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Configuration
|
||||
public class InternationalizationConfig implements WebMvcConfigurer {
|
||||
|
||||
@Bean
|
||||
public LocaleResolver localeResolver() {
|
||||
SessionLocaleResolver slr = new SessionLocaleResolver();
|
||||
slr.setDefaultLocale(Locale.of("es"));
|
||||
return slr;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addInterceptors(InterceptorRegistry registry) {
|
||||
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
|
||||
interceptor.setParamName("lang");
|
||||
registry.addInterceptor(interceptor);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public MessageSource messageSource() throws IOException {
|
||||
ReloadableResourceBundleMessageSource source = new ReloadableResourceBundleMessageSource();
|
||||
|
||||
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
|
||||
Resource[] resources = resolver.getResources("classpath*:i18n/*.properties");
|
||||
|
||||
// Extraer los nombres base sin extensión ni sufijos (_en, _es, etc.)
|
||||
Set<String> basenames = Arrays.stream(resources)
|
||||
.map(res -> {
|
||||
try {
|
||||
String uri = Objects.requireNonNull(res.getURI()).toString();
|
||||
// Ej: file:/.../i18n/login_en.properties
|
||||
String path = uri.substring(uri.indexOf("/i18n/") + 1); // i18n/login_en.properties
|
||||
String base = path.replaceAll("_[a-z]{2}\\.properties$", "") // login.properties
|
||||
.replaceAll("\\.properties$", "");
|
||||
return "classpath:" + base;
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
}
|
||||
})
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
source.setBasenames(basenames.toArray(new String[0]));
|
||||
source.setDefaultEncoding("UTF-8");
|
||||
|
||||
return source;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,26 @@
|
||||
package com.imprimelibros.erp.config;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||
import org.springframework.security.web.SecurityFilterChain;
|
||||
|
||||
@Configuration
|
||||
public class SecurityConfig {
|
||||
|
||||
@Bean
|
||||
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
|
||||
http
|
||||
.authorizeHttpRequests(auth -> auth
|
||||
.requestMatchers("/", "/assets/**", "/css/**", "/js/**", "/images/**", "/public/**").permitAll()
|
||||
.anyRequest().authenticated()
|
||||
)
|
||||
.formLogin(login -> login
|
||||
//.loginPage("/login") añadir cuando se tenga login personalizado
|
||||
.permitAll()
|
||||
)
|
||||
.logout(logout -> logout.permitAll());
|
||||
|
||||
return http.build();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,24 @@
|
||||
package com.imprimelibros.erp.controller;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.MessageSource;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
@Controller
|
||||
public class HomeController {
|
||||
|
||||
@Autowired
|
||||
private MessageSource messageSource;
|
||||
|
||||
@GetMapping("/")
|
||||
public String index(Model model, Locale locale) {
|
||||
//model.addAttribute("title", messageSource.getMessage("t-home", null, locale));
|
||||
model.addAttribute("title", "Inicio");
|
||||
return "imprimelibros/home";
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
package com.imprimelibros.erp.controller;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
|
||||
public class LoginController {
|
||||
|
||||
@GetMapping("/login")
|
||||
public String index(Model model, Locale locale) {
|
||||
return "imprimelibros/login/login";
|
||||
}
|
||||
}
|
||||
1
src/main/resources/i18n/login_en.properties
Normal file
1
src/main/resources/i18n/login_en.properties
Normal file
@ -0,0 +1 @@
|
||||
login.login=Login
|
||||
1
src/main/resources/i18n/login_es.properties
Normal file
1
src/main/resources/i18n/login_es.properties
Normal file
@ -0,0 +1 @@
|
||||
login.login=Iniciar sesión
|
||||
4
src/main/resources/i18n/presupuesto_en.properties
Normal file
4
src/main/resources/i18n/presupuesto_en.properties
Normal file
@ -0,0 +1,4 @@
|
||||
presupuesto.datos-generales=General Data
|
||||
presupuesto.interior=Inside
|
||||
presupuesto.cubierta=Cover
|
||||
presupuesto.envio=Shipping
|
||||
30
src/main/resources/i18n/presupuesto_es.properties
Normal file
30
src/main/resources/i18n/presupuesto_es.properties
Normal file
@ -0,0 +1,30 @@
|
||||
presupuesto.datos-generales=Datos Generales
|
||||
presupuesto.interior=Interior
|
||||
presupuesto.cubierta=Cubierta
|
||||
presupuesto.envio=Envío
|
||||
|
||||
# Pestaña datos generales de presupuesto
|
||||
presupuesto.informacion-libro=Información del libro
|
||||
presupuesto.datos-generales-descripcion=Datos generales del presupuesto
|
||||
presupuesto.titulo=Título*
|
||||
presupuesto.autor=Autor
|
||||
presupuesto.isbn=ISBN
|
||||
presupuesto.tirada1=Tirada 1*
|
||||
presupuesto.tirada2=Tirada 2
|
||||
presupuesto.tirada3=Tirada 3
|
||||
presupuesto.tirada4=Tirada 4
|
||||
presupuesto.tiradasPODnoPOD=No puede mezclar tiradas menores de 30 unidades con mayores de 30 unidades
|
||||
presupuesto.formato=Formato
|
||||
presupuesto.orientacion.vertical=Vertical
|
||||
presupuesto.orientacion.apaisado=Apaisado
|
||||
presupuesto.orientacion.cuadrado=Cuadrado
|
||||
presupuesto.formato-personalizado=Formato personalizado
|
||||
presupuesto.ancho=Ancho
|
||||
presupuesto.alto=Alto
|
||||
presupuesto.paginas-total=Total Páginas
|
||||
presupuesto.paginas-negro=Páginas Negro
|
||||
presupuesto.paginas-color=Páginas Color
|
||||
presupuesto.siempre-pares=Siempre deben ser pares
|
||||
presupuesto.encuadernacion=Encuadernación
|
||||
presupuesto.encuadernacion-descripcion=Seleccione la encuadernación del libro
|
||||
presupuesto.siguiente=Siguiente
|
||||
3
src/main/resources/static/assets/css/imprimelibros.css
Normal file
3
src/main/resources/static/assets/css/imprimelibros.css
Normal file
@ -0,0 +1,3 @@
|
||||
body {
|
||||
background-color: #fffbdd !important;
|
||||
}
|
||||
60
src/main/resources/static/assets/css/presupuestador.css
Normal file
60
src/main/resources/static/assets/css/presupuestador.css
Normal file
@ -0,0 +1,60 @@
|
||||
/* === Contenedor de cada opción === */
|
||||
.image-container {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
|
||||
/* Tamaño adaptable */
|
||||
width: 100%;
|
||||
max-width: 200px;
|
||||
|
||||
/* Para evitar que la imagen sobresalga al hacer zoom */
|
||||
overflow: hidden;
|
||||
|
||||
/* Borde invisible por defecto para evitar movimiento al seleccionar */
|
||||
border: 4px solid transparent;
|
||||
border-radius: 8px;
|
||||
padding: 8px;
|
||||
|
||||
transition: border 0.3s ease;
|
||||
}
|
||||
|
||||
/* === Borde visible cuando está seleccionada === */
|
||||
.image-container.selected {
|
||||
border-color: #687cfe;
|
||||
}
|
||||
|
||||
/* === Imagen interna === */
|
||||
.image-container img {
|
||||
max-width: 100%;
|
||||
max-height: 150px;
|
||||
display: block;
|
||||
transform-origin: center center;
|
||||
transition: transform 0.3s ease;
|
||||
}
|
||||
|
||||
/* === Animación de zoom con rebote === */
|
||||
.image-presupuesto.zoom-anim {
|
||||
animation: zoomPop 800ms cubic-bezier(0.68, -0.55, 0.27, 1.55);
|
||||
}
|
||||
|
||||
/* Keyframes para la animación */
|
||||
@keyframes zoomPop {
|
||||
0% { transform: scale(1); }
|
||||
40% { transform: scale(0.85); }
|
||||
80% { transform: scale(1.05); }
|
||||
100% { transform: scale(1); }
|
||||
}
|
||||
|
||||
.image-container:hover {
|
||||
cursor: pointer;
|
||||
box-shadow: 0 0 10px rgba(104, 124, 254, 0.3);
|
||||
}
|
||||
|
||||
@media (max-width: 576px) {
|
||||
.image-container {
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 32 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 8.9 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 40 KiB |
@ -0,0 +1,23 @@
|
||||
$(() => {
|
||||
$('.imagen-container-group').on('click', '.imagen-selector', function () {
|
||||
const clicked = $(this);
|
||||
const group = clicked.closest('.imagen-container-group');
|
||||
|
||||
// Limpiar selección anterior
|
||||
group.find('.imagen-selector').removeClass('selected preselected')
|
||||
.find('.image-presupuesto').removeClass('selected');
|
||||
|
||||
// Marcar nuevo seleccionado
|
||||
clicked.addClass('selected');
|
||||
const img = clicked.find('.image-presupuesto');
|
||||
img.addClass('selected');
|
||||
|
||||
// Aplicar animación (reset antes para que se repita)
|
||||
img.removeClass('zoom-anim');
|
||||
void img[0].offsetWidth; // "reflow" para reiniciar animación
|
||||
img.addClass('zoom-anim');
|
||||
|
||||
// Guardar ID en hidden si lo necesitas
|
||||
$('#tipoEncuadernacionSeleccionada').val(clicked.attr('id'));
|
||||
});
|
||||
});
|
||||
BIN
src/main/resources/templates/imprimelibros.zip
Normal file
BIN
src/main/resources/templates/imprimelibros.zip
Normal file
Binary file not shown.
42
src/main/resources/templates/imprimelibros/home.html
Normal file
42
src/main/resources/templates/imprimelibros/home.html
Normal file
@ -0,0 +1,42 @@
|
||||
<!doctype html>
|
||||
<html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
|
||||
layout:decorate="~{imprimelibros/layout}">
|
||||
|
||||
<head>
|
||||
<th:block layout:fragment="pagetitle" />
|
||||
<th:block th:replace="~{imprimelibros/partials/head-css :: head-css}" />
|
||||
<th:block layout:fragment="pagecss">
|
||||
<link th:href="@{/assets/css/presupuestador.css}" rel="stylesheet"
|
||||
th:unless="${#authorization.expression('isAuthenticated()')}" />
|
||||
</th:block>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div th:replace="~{imprimelibros/partials/topbar :: topbar}" />
|
||||
<div th:if="${#authorization.expression('isAuthenticated()')}">
|
||||
<div th:replace="~{imprimelibros/partials/sidebar :: sidebar}" />
|
||||
</div>
|
||||
|
||||
<th:block layout:fragment="content">
|
||||
<div th:if="${#authorization.expression('isAuthenticated()')}">
|
||||
<div class="container-fluid">
|
||||
<!-- contenido para usuario logueado -->
|
||||
</div>
|
||||
</div>
|
||||
<div th:unless="${#authorization.expression('isAuthenticated()')}">
|
||||
<div th:insert="~{imprimelibros/presupuestos/presupuestador :: presupuestador}"></div>
|
||||
</div>
|
||||
</th:block>
|
||||
|
||||
<th:block layout:fragment="modal" />
|
||||
<th:block th:replace="~{theme/partials/vendor-scripts :: scripts}" />
|
||||
<th:block layout:fragment="pagejs">
|
||||
<div th:unless="${#authorization.expression('isAuthenticated()')}">
|
||||
<script th:src="@{/assets/js/pages/imprimelibros/presupuestador/imagen-presupuesto.js}"></script>
|
||||
</div>
|
||||
</th:block>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
42
src/main/resources/templates/imprimelibros/layout.html
Normal file
42
src/main/resources/templates/imprimelibros/layout.html
Normal file
@ -0,0 +1,42 @@
|
||||
<html th:lang="${#locale.language}"
|
||||
th:with="isAuth=${#authorization.expression('isAuthenticated()')}"
|
||||
th:attrappend="data-layout=${isAuth} ? 'semibox' : 'horizontal'"
|
||||
data-sidebar-visibility="show"
|
||||
data-topbar="light"
|
||||
data-sidebar="light"
|
||||
data-sidebar-size="lg"
|
||||
data-sidebar-image="none"
|
||||
data-preloader="disable"
|
||||
xmlns:th="http://www.thymeleaf.org"
|
||||
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
|
||||
|
||||
<head>
|
||||
<th:block layout:fragment="pagetitle" />
|
||||
<th:block th:replace="~{imprimelibros/partials/head-css :: head-css}" />
|
||||
<th:block layout:fragment="pagecss" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div th:replace="~{imprimelibros/partials/topbar :: topbar}" />
|
||||
<div th:if="${#authorization.expression('isAuthenticated()')}">
|
||||
<div th:replace="~{imprimelibros/partials/sidebar :: sidebar}" />
|
||||
</div>
|
||||
|
||||
<section class="main-content">
|
||||
<div class="page-content">
|
||||
<div class="container-fluid">
|
||||
<section layout:fragment="content" th:remove="tag"></section>
|
||||
</div>
|
||||
</div>
|
||||
<div th:replace="~{imprimelibros/partials/footer :: footer}" />
|
||||
</section>
|
||||
|
||||
<th:block layout:fragment="modal" />
|
||||
<!-- de momento comenta vendor-scripts si no lo usas -->
|
||||
<th:block th:replace="~{theme/partials/vendor-scripts :: scripts}" />
|
||||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||
<th:block layout:fragment="pagejs" />
|
||||
<script th:src="@{/assets/js/app.js}"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@ -0,0 +1,16 @@
|
||||
<div th:fragment="footer" th:remove="tag">
|
||||
<footer class="footer">
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<span th:text="${T(java.time.Year).now()}">2025</span> © Imprime Libros.
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="text-sm-end d-none d-sm-block">
|
||||
Design & Develop by IMN & JJO
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
@ -0,0 +1,14 @@
|
||||
<div th:fragment="head-css" th:remove="tag">
|
||||
<!-- Layout config Js -->
|
||||
<script src="/assets/js/layout.js"></script>
|
||||
<!-- Bootstrap Css -->
|
||||
<link href="/assets/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
|
||||
<!-- Icons Css -->
|
||||
<link href="/assets/css/icons.min.css" rel="stylesheet" type="text/css" />
|
||||
<!-- App Css-->
|
||||
<link href="/assets/css/app.min.css" rel="stylesheet" type="text/css" />
|
||||
<!-- custom Css-->
|
||||
<link href="/assets/css/custom.min.css" rel="stylesheet" type="text/css" />
|
||||
|
||||
<link href="/assets/css/imprimelibros.css" rel="stylesheet" type="text/css" />
|
||||
</div>
|
||||
@ -0,0 +1,26 @@
|
||||
<div th:fragment="page-title(title,pagetitle)" th:remove="tag">
|
||||
<!-- start page title -->
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="page-title-box d-sm-flex align-items-center justify-content-between">
|
||||
<h4 th:data-key="${keyTitle}" class="mb-sm-0" th:text="${currentPage}"></h4>
|
||||
|
||||
<div class="page-title-right">
|
||||
<ol class="breadcrumb m-0">
|
||||
<li th:each="item : ${breadcrumb}" class="breadcrumb-item"
|
||||
th:classappend="${item.url == null}? 'active' : ''">
|
||||
|
||||
<a th:if="${item.url != null}" th:data-key="${item.dataKey}" th:href="${item.url}"
|
||||
th:text="${item.label}"></a>
|
||||
|
||||
<span th:if="${item.url == null}" th:data-key="${item.dataKey}"
|
||||
th:text="${item.label}"></span>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end page title -->
|
||||
</div>
|
||||
@ -0,0 +1,53 @@
|
||||
<div th:fragment="sidebar" th:remove="tag">
|
||||
<!-- ========== App Menu ========== -->
|
||||
<div class="app-menu navbar-menu">
|
||||
<!-- LOGO -->
|
||||
<div class="navbar-brand-box">
|
||||
<!-- Dark Logo-->
|
||||
<a href="/" class="logo logo-dark">
|
||||
<span class="logo-sm">
|
||||
<img src="/assets/images/logo-sm.png" alt="" height="22">
|
||||
</span>
|
||||
<span class="logo-lg">
|
||||
<img src="/assets/images/logo-dark.png" alt="" height="17">
|
||||
</span>
|
||||
</a>
|
||||
<!-- Light Logo-->
|
||||
<a href="/" class="logo logo-light">
|
||||
<span class="logo-sm">
|
||||
<img src="/assets/images/logo-sm.png" alt="" height="22">
|
||||
</span>
|
||||
<span class="logo-lg">
|
||||
<img src="/assets/images/logo-light.png" alt="" height="17">
|
||||
</span>
|
||||
</a>
|
||||
<button type="button" class="btn btn-sm p-0 fs-20 header-item float-end btn-vertical-sm-hover"
|
||||
id="vertical-hover">
|
||||
<i class="ri-record-circle-line"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div id="scrollbar">
|
||||
<div class="container-fluid">
|
||||
|
||||
<div id="two-column-menu">
|
||||
</div>
|
||||
<li href="/" class="menu-title"><span data-key="t-menu">Menu</span></li>
|
||||
<ul class="navbar-nav" id="navbar-nav">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link menu-link" href="/">
|
||||
<i class="ri-home-line"></i> <span data-key="t-home">Inicio</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- <div th:replace="~{printhub/partials/sidebarMenus/configurationMenu :: configuration}"></div> -->
|
||||
</ul>
|
||||
</div>
|
||||
<!-- Sidebar -->
|
||||
</div>
|
||||
|
||||
<div class="sidebar-background"></div>
|
||||
</div>
|
||||
<!-- Left Sidebar End -->
|
||||
<!-- Vertical Overlay-->
|
||||
<div class="vertical-overlay"></div>
|
||||
</div>
|
||||
@ -0,0 +1,16 @@
|
||||
<div th:fragment="configuration" th:remove="tag">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link menu-link" href="#configurationMenu" data-bs-toggle="collapse" role="button"
|
||||
aria-expanded="false" aria-controls="configurationMenu">
|
||||
<i class="ri-tools-line"></i> <span data-key="t-menu-config">Configuración</span>
|
||||
</a>
|
||||
<div class="collapse menu-dropdown" id="configurationMenu">
|
||||
<ul class="nav nav-sm flex-column">
|
||||
<li class="nav-item">
|
||||
<a href="/configuration/printers" class="nav-link" data-key="t-menu-config-impresioras">
|
||||
Impresoras </a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</li> <!-- end Dashboard Menu -->
|
||||
</div>
|
||||
@ -0,0 +1,8 @@
|
||||
<div th:fragment="title-meta(title)" th:remove="tag">
|
||||
<meta charset="utf-8" />
|
||||
<title text="imprimelibros'"></title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta content="Servicion de impresión personal" name="description" />
|
||||
<!-- App favicon -->
|
||||
<link rel="shortcut icon" href="/assets/images/favicon.ico">
|
||||
</div>
|
||||
128
src/main/resources/templates/imprimelibros/partials/topbar.html
Normal file
128
src/main/resources/templates/imprimelibros/partials/topbar.html
Normal file
@ -0,0 +1,128 @@
|
||||
<div th:fragment="topbar" th:remove="tag">
|
||||
<header id="page-topbar">
|
||||
<div class="layout-width">
|
||||
<div class="navbar-header">
|
||||
<div class="d-flex">
|
||||
<!-- LOGO -->
|
||||
<div class="navbar-brand-box horizontal-logo">
|
||||
<a href="/" class="logo logo-dark">
|
||||
<span class="logo-sm">
|
||||
<img src="/assets/images/logo-sm.png" alt="" height="22">
|
||||
</span>
|
||||
<span class="logo-lg">
|
||||
<img src="/assets/images/logo-dark.png" alt="" height="17">
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<a href="/" class="logo logo-light">
|
||||
<span class="logo-sm">
|
||||
<img src="/assets/images/logo-sm.png" alt="" height="22">
|
||||
</span>
|
||||
<span class="logo-lg">
|
||||
<img src="/assets/images/logo-light.png" alt="" height="17">
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<button type="button" class="btn btn-sm px-3 fs-16 header-item vertical-menu-btn topnav-hamburger"
|
||||
id="topnav-hamburger-icon">
|
||||
<span class="hamburger-icon">
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="d-flex align-items-center">
|
||||
|
||||
<div class="dropdown ms-1 topbar-head-dropdown header-item">
|
||||
<button type="button" class="btn btn-icon btn-topbar btn-ghost-secondary rounded-circle"
|
||||
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<img id="header-lang-img" src="/assets/images/flags/spain.svg" alt="Header Language"
|
||||
height="20" class="rounded">
|
||||
|
||||
</button>
|
||||
<div class="dropdown-menu dropdown-menu-end">
|
||||
|
||||
<!-- item-->
|
||||
<a href="javascript:void(0);" class="dropdown-item notify-item language" data-lang="es"
|
||||
title="Spanish">
|
||||
<img src="/assets/images/flags/spain.svg" alt="user-image" class="me-2 rounded"
|
||||
height="18">
|
||||
<span class="align-middle">Español</span>
|
||||
</a>
|
||||
|
||||
<!-- item-->
|
||||
<a href="javascript:void(0);" class="dropdown-item notify-item language py-2" data-lang="en"
|
||||
title="English">
|
||||
<img src="/assets/images/flags/gb.svg" alt="user-image" class="me-2 rounded"
|
||||
height="18">
|
||||
<span class="align-middle">English</span>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div th:if="${#authorization.expression('isAuthenticated()')}">
|
||||
<div class="dropdown ms-sm-3 header-item topbar-user">
|
||||
<button type="button" class="btn" id="page-header-user-dropdown" data-bs-toggle="dropdown"
|
||||
aria-haspopup="true" aria-expanded="false">
|
||||
<span class="d-flex align-items-center">
|
||||
<img class="rounded-circle header-profile-user"
|
||||
src="/assets/images/users/avatar-1.jpg" alt="Header Avatar">
|
||||
<span class="text-start ms-xl-2">
|
||||
<span class="d-none d-xl-inline-block ms-1 fw-medium user-name-text">Anna
|
||||
Adame</span>
|
||||
<span
|
||||
class="d-none d-xl-block ms-1 fs-12 text-muted user-name-sub-text">Founder</span>
|
||||
</span>
|
||||
</span>
|
||||
</button>
|
||||
<div class="dropdown-menu dropdown-menu-end">
|
||||
<!-- item-->
|
||||
<h6 class="dropdown-header">Welcome Anna!</h6>
|
||||
<a class="dropdown-item" href="/pages-profile"><i
|
||||
class="mdi mdi-account-circle text-muted fs-16 align-middle me-1"></i> <span
|
||||
class="align-middle">Profile</span></a>
|
||||
<a class="dropdown-item" href="/apps-chat"><i
|
||||
class="mdi mdi-message-text-outline text-muted fs-16 align-middle me-1"></i>
|
||||
<span class="align-middle">Messages</span></a>
|
||||
<a class="dropdown-item" href="/apps-tasks-kanban"><i
|
||||
class="mdi mdi-calendar-check-outline text-muted fs-16 align-middle me-1"></i>
|
||||
<span class="align-middle">Taskboard</span></a>
|
||||
<a class="dropdown-item" href="/pages-faqs"><i
|
||||
class="mdi mdi-lifebuoy text-muted fs-16 align-middle me-1"></i> <span
|
||||
class="align-middle">Help</span></a>
|
||||
<div class="dropdown-divider"></div>
|
||||
<a class="dropdown-item" href="/pages-profile"><i
|
||||
class="mdi mdi-wallet text-muted fs-16 align-middle me-1"></i> <span
|
||||
class="align-middle">Balance : <b>$5971.67</b></span></a>
|
||||
<a class="dropdown-item" href="/pages-profile-settings"><span
|
||||
class="badge bg-soft-success text-success mt-1 float-end">New</span><i
|
||||
class="mdi mdi-cog-outline text-muted fs-16 align-middle me-1"></i> <span
|
||||
class="align-middle">Settings</span></a>
|
||||
<a class="dropdown-item" href="auth-lockscreen-basic"><i
|
||||
class="mdi mdi-lock text-muted fs-16 align-middle me-1"></i> <span
|
||||
class="align-middle">Lock screen</span></a>
|
||||
<a class="dropdown-item" href="auth-logout-basic"><i
|
||||
class="mdi mdi-logout text-muted fs-16 align-middle me-1"></i> <span
|
||||
class="align-middle" data-key="t-logout">Logout</span></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Si NO está autenticado -->
|
||||
<div th:unless="${#authorization.expression('isAuthenticated()')}">
|
||||
<a href="/login" class="btn btn-outline-primary ms-sm-3">
|
||||
<i class="mdi mdi-login"></i> <label th:text="#{login.login}">Iniciar sesión</p>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
||||
</div>
|
||||
@ -0,0 +1,203 @@
|
||||
<div>
|
||||
<!-- 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.informacion-libro}">Información del
|
||||
libro</div>
|
||||
<h5 class="fs-14 text-end" th:text="#{presupuesto.datos-generales-descripcion}"></h5>
|
||||
</div>
|
||||
|
||||
<div class="ribbon-content mt-4">
|
||||
|
||||
<div class="px-2">
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div class="mb-3">
|
||||
<label for="titulo" class="form-label" th:text="#{presupuesto.titulo}">
|
||||
>Título*</label>
|
||||
<input type="text" class="form-control" id="titulo" placeholder="" value="">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<div class="mb-3">
|
||||
<label for="autor" class="form-label" th:text="#{presupuesto.autor}">Autor</label>
|
||||
<input type="text" class="form-control" id="autor" value="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="mb-3">
|
||||
<label for="isbn" class="form-label" th:text="#{presupuesto.isbn}">ISBN</label>
|
||||
<input type="text" class="form-control" id="isbn" value="">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="row">
|
||||
<div class="col-sm-3 mb-1">
|
||||
<label for="tirada" class="form-label" th:text="#{presupuesto.tirada1}">Tirada 1*</label>
|
||||
<input type="number" class="form-control" id="tirada" placeholder="" value="10">
|
||||
</div>
|
||||
<div class="col-sm-3 mb-1">
|
||||
<label for="tirada2" class="form-label" th:text="#{presupuesto.tirada2}">Tirada 2</label>
|
||||
<input type="number" class="form-control" id="tirada" placeholder="" value="">
|
||||
</div>
|
||||
<div class="col-sm-3 mb-1">
|
||||
<label for="tirada3" class="form-label" th:text="#{presupuesto.tirada3}">Tirada 3</label>
|
||||
<input type="number" class="form-control" id="tirada" placeholder="" value="">
|
||||
</div>
|
||||
<div class="col-sm-3 mb-1">
|
||||
<label for="tirada4" class="form-label" th:text="#{presupuesto.tirada4}">Tirada 4</label>
|
||||
<input type="number" class="form-control" id="tirada" placeholder="" value="">
|
||||
</div>
|
||||
</div>
|
||||
<p class="text-muted" th:text="#{presupuesto.tiradasPODnoPOD}">
|
||||
No puede mezclar tiradas menores de 30 unidades con mayores de 30
|
||||
unidades</p>
|
||||
</div>
|
||||
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-sm-4">
|
||||
<div class="mb-3">
|
||||
<label for="formato" class="form-label" th:text="#{presupuesto.formato}">Formato</label>
|
||||
<select class="form-control select2" id="formato">
|
||||
<optgroup th:label="#{presupuesto.orientacion.vertical}">
|
||||
<option value="148x210">148x210 (A5)</option>
|
||||
<option value="115x170">115x170</option>
|
||||
<option value="210x297">210x297 (A4)</option>
|
||||
</optgroup>
|
||||
<optgroup th:label="#{presupuesto.orientacion.cuadrado}">
|
||||
<option value="210x210">210x210</option>
|
||||
<option value="230x230">230x230</option>
|
||||
</optgroup>
|
||||
<optgroup th:label="#{presupuesto.orientacion.apaisado}">
|
||||
<option value="210x148">210x148 (A5)</option>
|
||||
<option value="240x170">240x170</option>
|
||||
<option value="297x210">297x210 (A4)</option>
|
||||
</optgroup>
|
||||
</select>
|
||||
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="form-check form-switch form-switch-left form-switch-md">
|
||||
<input type="checkbox" class="form-check-input" id="checkbox-button">
|
||||
<label for="checkbox-button" class="form-label"
|
||||
th:text="#{presupuesto.formato-personalizado}">Formato
|
||||
Personalizado</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="row justify-content-center mb-2">
|
||||
<div class="col-sm-2">
|
||||
<label for="paginas-negro" class="form-label" th:text="#{presupuesto.paginas-negro}">Páginas
|
||||
Negro</label>
|
||||
<input type="number" step="2" class="form-control" id="paginas-negro" name="paginas-negro"
|
||||
value="0">
|
||||
<div class="form-text" th:text="#{presupuesto.siempre-pares}">
|
||||
Siempre deben ser pares</div>
|
||||
</div>
|
||||
|
||||
<div class="col-auto d-flex align-items-center justify-content-center">
|
||||
<i class="mdi mdi-plus-box fs-2"></i>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-2">
|
||||
<label for="paginas-color" class="form-label" th:text="#{presupuesto.paginas-color}">Páginas
|
||||
Color</label>
|
||||
<input type="number" step="2" class="form-control" id="paginas-color" name="paginas-color"
|
||||
value="32">
|
||||
<div class="form-text" th:text="#{presupuesto.siempre-pares}">
|
||||
Siempre deben ser pares</div>
|
||||
</div>
|
||||
|
||||
<div class="col-auto d-flex align-items-center justify-content-center">
|
||||
<i class="mdi mdi-equal-box fs-2"></i>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-2">
|
||||
<label for="paginas" class="form-label" th:text="#{presupuesto.paginas-total}">Total
|
||||
Páginas</label>
|
||||
<input disabled class="form-control" id="paginas" name="paginas" value="32">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!-- End Ribbon Shape -->
|
||||
|
||||
<!-- Ribbon Shape -->
|
||||
<div class="card ribbon-box border shadow-none mb-lg-0 material-shadow mt-4">
|
||||
<div class="card-body">
|
||||
<div class="ribbon ribbon-primary ribbon-shape" th:text="#{presupuesto.encuadernacion}">Encuadernación</div>
|
||||
<h5 class="fs-14 text-end" th:text="#{presupuesto.encuadernacion-descripcion}">
|
||||
Seleccione la encuadernación del libro</h5>
|
||||
</div>
|
||||
|
||||
<div class="ribbon-content mt-4">
|
||||
|
||||
<div class="px-2">
|
||||
<div class="row justify-content-center imagen-container-group">
|
||||
|
||||
<!-- Opción: Fresado -->
|
||||
<div class="col-12 col-sm-6 col-md-4 d-flex justify-content-center mb-4 selected">
|
||||
<div class="image-container imagen-selector" id="fresado">
|
||||
<img class="image-presupuesto" src="/assets/images/imprimelibros/presupuestador/fresado.png"
|
||||
alt="Fresado" />
|
||||
<div class="form-text text-center">Fresado (a partir de 32 páginas)</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Opción: Cosido -->
|
||||
<div class="col-12 col-sm-6 col-md-4 d-flex justify-content-center mb-4">
|
||||
<div class="image-container imagen-selector" id="cosido">
|
||||
<img class="image-presupuesto" src="/assets/images/imprimelibros/presupuestador/cosido.png"
|
||||
alt="Cosido" />
|
||||
<div class="form-text text-center">Cosido (a partir de 32 páginas)</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Opción: Grapado -->
|
||||
<div class="col-12 col-sm-6 col-md-4 d-flex justify-content-center mb-4">
|
||||
<div class="image-container imagen-selector" id="grapado">
|
||||
<img class="image-presupuesto" src="/assets/images/imprimelibros/presupuestador/grapado.png"
|
||||
alt="Grapado" />
|
||||
<div class="form-text text-center">Grapado (entre 12 y 40 páginas)</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Opción: Espiral -->
|
||||
<div class="col-12 col-sm-6 col-md-4 d-flex justify-content-center mb-4">
|
||||
<div class="image-container imagen-selector" id="espiral">
|
||||
<img class="image-presupuesto" src="/assets/images/imprimelibros/presupuestador/espiral.png"
|
||||
alt="Espiral" />
|
||||
<div class="form-text text-center">Espiral (a partir de 20 páginas)</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Opción: Wire-O -->
|
||||
<div class="col-12 col-sm-6 col-md-4 d-flex justify-content-center mb-4">
|
||||
<div class="image-container imagen-selector" id="wireo">
|
||||
<img class="image-presupuesto" src="/assets/images/imprimelibros/presupuestador/wire-o.png"
|
||||
alt="Wire-O" />
|
||||
<div class="form-text text-center">Wire-O (a partir de 20 páginas)</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex align-items-start gap-3 mt-3">
|
||||
<button type="button" id="next-datos-generales" class="btn btn-primary btn-label right ms-auto">
|
||||
<i class="ri-arrow-right-circle-line align-middle fs-16 ms-2"></i>
|
||||
<label th:text="#{presupuesto.siguiente}">Siguiente</label>
|
||||
</button>
|
||||
</div>
|
||||
@ -0,0 +1,419 @@
|
||||
<div th:fragment="presupuestador">
|
||||
<div class="row">
|
||||
<div class="col-xl-8">
|
||||
<div class="card">
|
||||
<div class="card-body checkout-tab">
|
||||
|
||||
<form action="#">
|
||||
<div class="step-arrow-nav mt-n3 mx-n3 mb-3">
|
||||
|
||||
<ul class="nav nav-pills nav-justified custom-nav" role="tablist">
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link fs-15 p-3 active" id="pills-general-data-tab"
|
||||
data-bs-toggle="pill" data-bs-target="#pills-general-data" type="button"
|
||||
role="tab" aria-controls="pills-general-data" aria-selected="true">
|
||||
<i
|
||||
class="ri-information-fill fs-16 p-2 bg-soft-primary text-primary rounded-circle align-middle me-2"></i>
|
||||
<label th:text="#{presupuesto.datos-generales}">Datos Generales</label>
|
||||
</button>
|
||||
</li>
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link fs-15 p-3" id="pills-inside-tab" data-bs-toggle="pill"
|
||||
data-bs-target="#pills-inside" type="button" role="tab"
|
||||
aria-controls="pills-inside" aria-selected="false">
|
||||
<i
|
||||
class="ri-book-open-line fs-16 p-2 bg-soft-primary text-primary rounded-circle align-middle me-2"></i>
|
||||
<label th:text="#{presupuesto.interior}">Interior</label>
|
||||
</button>
|
||||
</li>
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link fs-15 p-3" id="pills-cover-tab" data-bs-toggle="pill"
|
||||
data-bs-target="#pills-cover" type="button" role="tab"
|
||||
aria-controls="pills-cover" aria-selected="false">
|
||||
<i
|
||||
class="ri-book-2-line fs-16 p-2 bg-soft-primary text-primary rounded-circle align-middle me-2"></i>
|
||||
<label th:text="#{presupuesto.cubierta}">Cubierta</label>
|
||||
</button>
|
||||
</li>
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link fs-15 p-3" id="pills-shipping-tab" data-bs-toggle="pill"
|
||||
data-bs-target="#pills-shipping" type="button" role="tab"
|
||||
aria-controls="pills-shipping" aria-selected="false">
|
||||
<i
|
||||
class="ri-truck-line fs-16 p-2 bg-soft-primary text-primary rounded-circle align-middle me-2"></i>
|
||||
<label th:text="#{presupuesto.envio}">Envío</label>
|
||||
</button>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane fade show active" id="pills-general-data" role="tabpanel"
|
||||
aria-labelledby="pills-general-data-tab">
|
||||
|
||||
<div th:include="~{imprimelibros/presupuestos/presupuestador-items/_datos-generales.html}"></div>
|
||||
|
||||
</div>
|
||||
<!-- end tab pane -->
|
||||
|
||||
<div class="tab-pane fade" id="pills-bill-address" role="tabpanel"
|
||||
aria-labelledby="pills-bill-address-tab">
|
||||
<div>
|
||||
<h5 class="mb-1">Shipping Information</h5>
|
||||
<p class="text-muted mb-4">Please fill all information below</p>
|
||||
</div>
|
||||
|
||||
<div class="mt-4">
|
||||
<div class="d-flex align-items-center mb-2">
|
||||
<div class="flex-grow-1">
|
||||
<h5 class="fs-14 mb-0">Saved Address</h5>
|
||||
</div>
|
||||
<div class="flex-shrink-0">
|
||||
<!-- Button trigger modal -->
|
||||
<button type="button" class="btn btn-sm btn-info mb-3"
|
||||
data-bs-toggle="modal" data-bs-target="#addAddressModal">
|
||||
Add Address
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row gy-3">
|
||||
<div class="col-lg-4 col-sm-6">
|
||||
<div class="form-check card-radio">
|
||||
<input id="shippingAddress01" name="shippingAddress" type="radio"
|
||||
class="form-check-input" checked>
|
||||
<label class="form-check-label" for="shippingAddress01">
|
||||
<span
|
||||
class="mb-4 fw-semibold d-block text-muted text-uppercase">Home
|
||||
Address</span>
|
||||
|
||||
<span class="fs-14 mb-2 d-block">Marcus Alfaro</span>
|
||||
<span class="text-muted fw-normal text-wrap mb-1 d-block">4739
|
||||
Bubby Drive Austin, TX 78729</span>
|
||||
<span class="text-muted fw-normal d-block">Mo.
|
||||
012-345-6789</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="d-flex flex-wrap p-2 py-1 bg-light rounded-bottom border mt-n1">
|
||||
<div>
|
||||
<a href="#" class="d-block text-body p-1 px-2"
|
||||
data-bs-toggle="modal" data-bs-target="#addAddressModal"><i
|
||||
class="ri-pencil-fill text-muted align-bottom me-1"></i>
|
||||
Edit</a>
|
||||
</div>
|
||||
<div>
|
||||
<a href="#" class="d-block text-body p-1 px-2"
|
||||
data-bs-toggle="modal" data-bs-target="#removeItemModal"><i
|
||||
class="ri-delete-bin-fill text-muted align-bottom me-1"></i>
|
||||
Remove</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4 col-sm-6">
|
||||
<div class="form-check card-radio">
|
||||
<input id="shippingAddress02" name="shippingAddress" type="radio"
|
||||
class="form-check-input">
|
||||
<label class="form-check-label" for="shippingAddress02">
|
||||
<span
|
||||
class="mb-4 fw-semibold d-block text-muted text-uppercase">Office
|
||||
Address</span>
|
||||
|
||||
<span class="fs-14 mb-2 d-block">James Honda</span>
|
||||
<span class="text-muted fw-normal text-wrap mb-1 d-block">1246
|
||||
Virgil Street Pensacola, FL 32501</span>
|
||||
<span class="text-muted fw-normal d-block">Mo.
|
||||
012-345-6789</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="d-flex flex-wrap p-2 py-1 bg-light rounded-bottom border mt-n1">
|
||||
<div>
|
||||
<a href="#" class="d-block text-body p-1 px-2"
|
||||
data-bs-toggle="modal" data-bs-target="#addAddressModal"><i
|
||||
class="ri-pencil-fill text-muted align-bottom me-1"></i>
|
||||
Edit</a>
|
||||
</div>
|
||||
<div>
|
||||
<a href="#" class="d-block text-body p-1 px-2"
|
||||
data-bs-toggle="modal" data-bs-target="#removeItemModal"><i
|
||||
class="ri-delete-bin-fill text-muted align-bottom me-1"></i>
|
||||
Remove</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-4">
|
||||
<h5 class="fs-14 mb-3">Shipping Method</h5>
|
||||
|
||||
<div class="row g-4">
|
||||
<div class="col-lg-6">
|
||||
<div class="form-check card-radio">
|
||||
<input id="shippingMethod01" name="shippingMethod" type="radio"
|
||||
class="form-check-input" checked>
|
||||
<label class="form-check-label" for="shippingMethod01">
|
||||
<span
|
||||
class="fs-20 float-end mt-2 text-wrap d-block fw-semibold">Free</span>
|
||||
<span class="fs-14 mb-1 text-wrap d-block">Free
|
||||
Delivery</span>
|
||||
<span class="text-muted fw-normal text-wrap d-block">Expected
|
||||
Delivery 3 to 5 Days</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-6">
|
||||
<div class="form-check card-radio">
|
||||
<input id="shippingMethod02" name="shippingMethod" type="radio"
|
||||
class="form-check-input" checked>
|
||||
<label class="form-check-label" for="shippingMethod02">
|
||||
<span
|
||||
class="fs-20 float-end mt-2 text-wrap d-block fw-semibold">$24.99</span>
|
||||
<span class="fs-14 mb-1 text-wrap d-block">Express
|
||||
Delivery</span>
|
||||
<span class="text-muted fw-normal text-wrap d-block">Delivery
|
||||
within 24hrs.</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-flex align-items-start gap-3 mt-4">
|
||||
<button type="button" class="btn btn-light btn-label previestab"
|
||||
data-previous="pills-bill-info-tab"><i
|
||||
class="ri-arrow-left-line label-icon align-middle fs-16 me-2"></i>Back
|
||||
to Personal Info</button>
|
||||
<button type="button" class="btn btn-primary btn-label right ms-auto nexttab"
|
||||
data-nexttab="pills-payment-tab"><i
|
||||
class="ri-bank-card-line label-icon align-middle fs-16 ms-2"></i>Continue
|
||||
to Payment</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end tab pane -->
|
||||
|
||||
<div class="tab-pane fade" id="pills-payment" role="tabpanel"
|
||||
aria-labelledby="pills-payment-tab">
|
||||
<div>
|
||||
<h5 class="mb-1">Payment Selection</h5>
|
||||
<p class="text-muted mb-4">Please select and enter your billing information</p>
|
||||
</div>
|
||||
|
||||
<div class="row g-4">
|
||||
<div class="col-lg-4 col-sm-6">
|
||||
<div data-bs-toggle="collapse" data-bs-target="#paymentmethodCollapse.show"
|
||||
aria-expanded="false" aria-controls="paymentmethodCollapse">
|
||||
<div class="form-check card-radio">
|
||||
<input id="paymentMethod01" name="paymentMethod" type="radio"
|
||||
class="form-check-input">
|
||||
<label class="form-check-label" for="paymentMethod01">
|
||||
<span class="fs-16 text-muted me-2"><i
|
||||
class="ri-paypal-fill align-bottom"></i></span>
|
||||
<span class="fs-14 text-wrap">Paypal</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4 col-sm-6">
|
||||
<div data-bs-toggle="collapse" data-bs-target="#paymentmethodCollapse"
|
||||
aria-expanded="true" aria-controls="paymentmethodCollapse">
|
||||
<div class="form-check card-radio">
|
||||
<input id="paymentMethod02" name="paymentMethod" type="radio"
|
||||
class="form-check-input" checked>
|
||||
<label class="form-check-label" for="paymentMethod02">
|
||||
<span class="fs-16 text-muted me-2"><i
|
||||
class="ri-bank-card-fill align-bottom"></i></span>
|
||||
<span class="fs-14 text-wrap">Credit / Debit Card</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-4 col-sm-6">
|
||||
<div data-bs-toggle="collapse" data-bs-target="#paymentmethodCollapse.show"
|
||||
aria-expanded="false" aria-controls="paymentmethodCollapse">
|
||||
<div class="form-check card-radio">
|
||||
<input id="paymentMethod03" name="paymentMethod" type="radio"
|
||||
class="form-check-input">
|
||||
<label class="form-check-label" for="paymentMethod03">
|
||||
<span class="fs-16 text-muted me-2"><i
|
||||
class="ri-money-dollar-box-fill align-bottom"></i></span>
|
||||
<span class="fs-14 text-wrap">Cash on Delivery</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="collapse show" id="paymentmethodCollapse">
|
||||
<div class="card p-4 border shadow-none mb-0 mt-4">
|
||||
<div class="row gy-3">
|
||||
<div class="col-md-12">
|
||||
<label for="cc-name" class="form-label">Name on card</label>
|
||||
<input type="text" class="form-control" id="cc-name"
|
||||
placeholder="Enter name">
|
||||
<small class="text-muted">Full name as displayed on card</small>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<label for="cc-number" class="form-label">Credit card number</label>
|
||||
<input type="text" class="form-control" id="cc-number"
|
||||
placeholder="xxxx xxxx xxxx xxxx">
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<label for="cc-expiration" class="form-label">Expiration</label>
|
||||
<input type="text" class="form-control" id="cc-expiration"
|
||||
placeholder="MM/YY">
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<label for="cc-cvv" class="form-label">CVV</label>
|
||||
<input type="text" class="form-control" id="cc-cvv" placeholder="xxx">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-muted mt-2 fst-italic">
|
||||
<i data-feather="lock" class="text-muted icon-xs"></i> Your transaction is
|
||||
secured with SSL encryption
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-flex align-items-start gap-3 mt-4">
|
||||
<button type="button" class="btn btn-light btn-label previestab"
|
||||
data-previous="pills-bill-address-tab"><i
|
||||
class="ri-arrow-left-line label-icon align-middle fs-16 me-2"></i>Back
|
||||
to Shipping</button>
|
||||
<button type="button" class="btn btn-secondary btn-label right ms-auto nexttab"
|
||||
data-nexttab="pills-finish-tab"><i
|
||||
class="ri-shopping-basket-line label-icon align-middle fs-16 ms-2"></i>Complete
|
||||
Order</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end tab pane -->
|
||||
|
||||
<div class="tab-pane fade" id="pills-finish" role="tabpanel"
|
||||
aria-labelledby="pills-finish-tab">
|
||||
<div class="text-center py-5">
|
||||
|
||||
<div class="mb-4">
|
||||
<lord-icon src="https://cdn.lordicon.com/lupuorrc.json" trigger="loop"
|
||||
colors="primary:#0ab39c,secondary:#405189"
|
||||
style="width:120px;height:120px"></lord-icon>
|
||||
</div>
|
||||
<h5>Thank you ! Your Order is Completed !</h5>
|
||||
<p class="text-muted">You will receive an order confirmation email with details
|
||||
of your order.</p>
|
||||
|
||||
<h5 class="fw-semibold">Order ID: <a href="/apps-ecommerce-order-details"
|
||||
class="text-decoration-underline">VZ2451</a></h5>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end tab pane -->
|
||||
</div>
|
||||
<!-- end tab content -->
|
||||
</form>
|
||||
</div>
|
||||
<!-- end card body -->
|
||||
</div>
|
||||
<!-- end card -->
|
||||
</div>
|
||||
<!-- end col -->
|
||||
|
||||
<div class="col-xl-4">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="d-flex">
|
||||
<div class="flex-grow-1">
|
||||
<h5 class="card-title mb-0">Order Summary</h5>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive table-card">
|
||||
<table class="table table-borderless align-middle mb-0">
|
||||
<thead class="table-light text-muted">
|
||||
<tr>
|
||||
<th style="width: 90px;" scope="col">Product</th>
|
||||
<th scope="col">Product Info</th>
|
||||
<th scope="col" class="text-end">Price</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="avatar-md bg-light rounded p-1">
|
||||
<img src="/assets/images/products/img-8.png" alt=""
|
||||
class="img-fluid d-block">
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<h5 class="fs-14"><a href="/apps-ecommerce-product-details"
|
||||
class="text-dark">Sweatshirt for Men (Pink)</a></h5>
|
||||
<p class="text-muted mb-0">$ 119.99 x 2</p>
|
||||
</td>
|
||||
<td class="text-end">$ 239.98</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="avatar-md bg-light rounded p-1">
|
||||
<img src="/assets/images/products/img-7.png" alt=""
|
||||
class="img-fluid d-block">
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<h5 class="fs-14"><a href="/apps-ecommerce-product-details"
|
||||
class="text-dark">Noise Evolve Smartwatch</a></h5>
|
||||
<p class="text-muted mb-0">$ 94.99 x 1</p>
|
||||
</td>
|
||||
<td class="text-end">$ 94.99</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="avatar-md bg-light rounded p-1">
|
||||
<img src="/assets/images/products/img-3.png" alt=""
|
||||
class="img-fluid d-block">
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<h5 class="fs-14"><a href="/apps-ecommerce-product-details"
|
||||
class="text-dark">350 ml Glass Grocery Container</a></h5>
|
||||
<p class="text-muted mb-0">$ 24.99 x 1</p>
|
||||
</td>
|
||||
<td class="text-end">$ 24.99</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fw-semibold" colspan="2">Sub Total :</td>
|
||||
<td class="fw-semibold text-end">$ 359.96</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">Discount <span class="text-muted">(VELZON15)</span> : </td>
|
||||
<td class="text-end">- $ 50.00</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">Shipping Charge :</td>
|
||||
<td class="text-end">$ 24.99</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">Estimated Tax (12%): </td>
|
||||
<td class="text-end">$ 18.20</td>
|
||||
</tr>
|
||||
<tr class="table-active">
|
||||
<th colspan="2">Total (USD) :</th>
|
||||
<td class="text-end">
|
||||
<span class="fw-semibold">
|
||||
$353.15
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- end card body -->
|
||||
</div>
|
||||
<!-- end card -->
|
||||
</div>
|
||||
<!-- end col -->
|
||||
</div>
|
||||
<!--end row-->
|
||||
</div>
|
||||
Reference in New Issue
Block a user