Commit e0e7c07a63d69bf52595b475b28fa2bab5a28fe9

Authored by Antigravity AI
1 parent 99c89404

Hito: Landing Page AdminLTE 3 y aislamiento de iFrame para Visor GIS.

GIS-GEOSERVER/VERSION.txt
@@ -7,4 +7,5 @@ V e r s i o n d e E s t a b i l i z a c i o n S I G ( A b r i l 2 0 2 @@ -7,4 +7,5 @@ V e r s i o n d e E s t a b i l i z a c i o n S I G ( A b r i l 2 0 2
7 Version de Estabilizacion SIG (Abril 2026) - 2026.04.05.01.49.29 ID DOCKER: c68e229b6d94 7 Version de Estabilizacion SIG (Abril 2026) - 2026.04.05.01.49.29 ID DOCKER: c68e229b6d94
8 Mapa Coloreado 8 Mapa Coloreado
9 Version de Estabilizacion SIG (Abril 2026) - 2026.04.05.04.28.49 ID DOCKER: c68e229b6d94. Observación: Fix de las contraseñas WMS y polígonos a full color. 9 Version de Estabilizacion SIG (Abril 2026) - 2026.04.05.04.28.49 ID DOCKER: c68e229b6d94. Observación: Fix de las contraseñas WMS y polígonos a full color.
10 -Versión de Estabilización SIG (Abril 2026) - 2026.04.05.06.31.00 ID DOCKER: c68e229b6d94. Observación: Reestructuracion pura de BaseMap y soporte Google auto-escalado satelital.  
11 \ No newline at end of file 10 \ No newline at end of file
  11 +Versión de Estabilización SIG (Abril 2026) - 2026.04.05.06.31.00 ID DOCKER: c68e229b6d94. Observación: Reestructuracion pura de BaseMap y soporte Google auto-escalado satelital.
  12 +Versión SIG (Abril 2026) - 2026.04.06.01.13.00 ID DOCKER: d983a409769d. Observación: Integración exitosa de Landing Page AdminLTE 3 con aislamiento de iFrame para Visor GIS.
12 \ No newline at end of file 13 \ No newline at end of file
GIS-GEOSERVER/src/main/java/com/sigem/gis/controller/WebViewController.java
@@ -16,6 +16,16 @@ public class WebViewController { @@ -16,6 +16,16 @@ public class WebViewController {
16 return "forward:/mapas.html"; 16 return "forward:/mapas.html";
17 } 17 }
18 18
  19 + @GetMapping("/landing")
  20 + public String landing() {
  21 + return "forward:/landing.html";
  22 + }
  23 +
  24 + @GetMapping("/widgets")
  25 + public String widgets() {
  26 + return "forward:/widgets.html";
  27 + }
  28 +
19 @GetMapping("/") 29 @GetMapping("/")
20 public String index() { 30 public String index() {
21 return "redirect:/login"; 31 return "redirect:/login";
GIS-GEOSERVER/src/main/java/com/sigem/gis/security/SecurityConfig.java
@@ -29,7 +29,7 @@ public class SecurityConfig { @@ -29,7 +29,7 @@ public class SecurityConfig {
29 .requestMatchers("/api/auth/**").permitAll() // Login 29 .requestMatchers("/api/auth/**").permitAll() // Login
30 .requestMatchers("/api/admin/**").permitAll() // Admin FDW 30 .requestMatchers("/api/admin/**").permitAll() // Admin FDW
31 .requestMatchers("/api/gis/**").permitAll() // API Datos GIS (Estadísticas) 31 .requestMatchers("/api/gis/**").permitAll() // API Datos GIS (Estadísticas)
32 - .requestMatchers("/login.html", "/", "/mapas/**", "/login", "/error").permitAll() 32 + .requestMatchers("/login.html", "/", "/mapas/**", "/login", "/error", "/landing", "/landing.html", "/widgets", "/widgets.html").permitAll()
33 .requestMatchers("/mapas_institucional.html").permitAll() 33 .requestMatchers("/mapas_institucional.html").permitAll()
34 .requestMatchers("/css/**", "/js/**", "/img/**", "/vendor/**").permitAll() // Recursos 34 .requestMatchers("/css/**", "/js/**", "/img/**", "/vendor/**").permitAll() // Recursos
35 .requestMatchers("/gwc/**", "/sigem/**", "/wms/**", "/wfs/**", "/rest/**").permitAll() // Proxy Geoserver 35 .requestMatchers("/gwc/**", "/sigem/**", "/wms/**", "/wfs/**", "/rest/**").permitAll() // Proxy Geoserver
@@ -41,7 +41,8 @@ public class SecurityConfig { @@ -41,7 +41,8 @@ public class SecurityConfig {
41 .httpBasic(basic -> basic.disable()) // Deshabilitar específicamente HTTP Basic 41 .httpBasic(basic -> basic.disable()) // Deshabilitar específicamente HTTP Basic
42 .formLogin(form -> form.disable()) // Deshabilitar específicamente el formulario por defecto 42 .formLogin(form -> form.disable()) // Deshabilitar específicamente el formulario por defecto
43 // Interceptor que inyecta la lógica de JWT antes de procesar el Username/Password estándar 43 // Interceptor que inyecta la lógica de JWT antes de procesar el Username/Password estándar
44 - .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class); 44 + .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class)
  45 + .headers(headers -> headers.frameOptions(frame -> frame.sameOrigin()));
45 46
46 return http.build(); 47 return http.build();
47 } 48 }
GIS-GEOSERVER/src/main/resources/static/landing.html 0 → 100644
  1 +<!DOCTYPE html>
  2 +<html lang="es">
  3 +<head>
  4 + <meta charset="utf-8">
  5 + <meta name="viewport" content="width=device-width, initial-scale=1">
  6 + <title>SIGEMWEB - Dashboard</title>
  7 +
  8 + <!-- Google Font: Source Sans Pro -->
  9 + <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
  10 + <!-- Font Awesome -->
  11 + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
  12 + <!-- Theme style -->
  13 + <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/css/adminlte.min.css">
  14 + <style>
  15 + .content-wrapper { padding: 0; margin-left: 250px; height: calc(100vh - 57px); overflow: hidden; }
  16 + iframe#main-iframe { width: 100%; height: 100%; border: none; }
  17 + .brand-link { background-color: #0056b3 !important; color: white !important; font-weight: bold;}
  18 + .main-header { background-color: #006ddb !important; border-bottom: none; }
  19 + .navbar-light .navbar-nav .nav-link { color: white; font-weight: 600;}
  20 + /* Treeview in popup */
  21 + .modal-treeview ul { list-style-type: none; padding-left: 20px; }
  22 + .modal-treeview li { margin-bottom: 5px; cursor: default;}
  23 + .modal-treeview li span { font-size: 14px; font-weight: 500; }
  24 + .modal-treeview li span.clickable:hover { color: #0056b3; cursor: pointer; font-weight: bold; }
  25 + </style>
  26 +</head>
  27 +<body class="hold-transition sidebar-mini layout-fixed">
  28 +<div class="wrapper">
  29 +
  30 + <!-- Navbar -->
  31 + <nav class="main-header navbar navbar-expand navbar-light">
  32 + <!-- Left navbar links -->
  33 + <ul class="navbar-nav">
  34 + <li class="nav-item">
  35 + <a class="nav-link" data-widget="pushmenu" href="#" role="button"><i class="fas fa-bars"></i></a>
  36 + </li>
  37 + <li class="nav-item d-none d-sm-inline-block">
  38 + <span class="nav-link" style="color: white; font-size: 18px; margin-left:10px;">Municipalidad de <span id="nav-entidad-text" style="font-weight: 800;">...</span> <span style="font-size: 14px; font-weight: 300;">¡Emergente y Sostenible!</span></span>
  39 + </li>
  40 + </ul>
  41 +
  42 + <!-- Right navbar links -->
  43 + <ul class="navbar-nav ml-auto">
  44 + <li class="nav-item dropdown">
  45 + <a class="nav-link" data-toggle="dropdown" href="#" style="color: white;">
  46 + <i class="far fa-user mr-2"></i> <span id="nav-user-text">Cargando...</span>
  47 + </a>
  48 + <div class="dropdown-menu dropdown-menu-lg dropdown-menu-right">
  49 + <a href="#" class="dropdown-item" onclick="cerrarSesion()">
  50 + <i class="fas fa-sign-out-alt mr-2 text-danger"></i> Cerrar Sesión
  51 + </a>
  52 + </div>
  53 + </li>
  54 + </ul>
  55 + </nav>
  56 + <!-- /.navbar -->
  57 +
  58 + <!-- Main Sidebar Container -->
  59 + <aside class="main-sidebar sidebar-dark-primary elevation-4">
  60 + <!-- Brand Logo -->
  61 + <a href="#" class="brand-link text-center mb-2">
  62 + <span class="brand-text"><b>SIGEM</b>WEB</span>
  63 + </a>
  64 +
  65 + <!-- Sidebar Menu -->
  66 + <nav class="mt-2">
  67 + <ul class="nav nav-pills nav-sidebar flex-column text-sm" data-widget="treeview" role="menu" data-accordion="false">
  68 +
  69 + <li class="nav-item">
  70 + <a href="#" class="nav-link" onclick="loadContent('/gis-geoserver/widgets')">
  71 + <i class="nav-icon fas fa-tachometer-alt"></i>
  72 + <p>Dashboard <span class="right badge badge-primary">New</span></p>
  73 + </a>
  74 + </li>
  75 +
  76 + <!-- Legacy Tree -->
  77 + <li class="nav-item menu-open">
  78 + <a href="#" class="nav-link active" style="background-color: #343a40;">
  79 + <i class="nav-icon fas fa-chart-line"></i>
  80 + <p>
  81 + Control de Gestión
  82 + <i class="right fas fa-angle-left"></i>
  83 + </p>
  84 + </a>
  85 + <ul class="nav nav-treeview">
  86 + <li class="nav-item menu-open">
  87 + <a href="#" class="nav-link">
  88 + <i class="far fa-dot-circle nav-icon"></i>
  89 + <p>Mapas <i class="right fas fa-angle-left"></i></p>
  90 + </a>
  91 + <ul class="nav nav-treeview" style="margin-left: 10px;">
  92 + <li class="nav-item menu-open">
  93 + <a href="#" class="nav-link">
  94 + <i class="fas fa-map nav-icon text-info"></i>
  95 + <p>Tributarios <i class="right fas fa-angle-left"></i></p>
  96 + </a>
  97 + <ul class="nav nav-treeview" style="margin-left: 10px;">
  98 + <li class="nav-item">
  99 + <a href="#" class="nav-link" data-toggle="modal" data-target="#modalMorosidad">
  100 + <i class="fas fa-layer-group nav-icon text-warning"></i>
  101 + <p>Mapa Morosidad/Pago</p>
  102 + </a>
  103 + </li>
  104 + </ul>
  105 + </li>
  106 + </ul>
  107 + </li>
  108 + </ul>
  109 + </li>
  110 +
  111 + <!-- Dummy Options -->
  112 + <li class="nav-header">OTRAS OPCIONES</li>
  113 + <li class="nav-item">
  114 + <a href="#" class="nav-link" onclick="notImplemented()">
  115 + <i class="nav-icon fas fa-file-invoice-dollar text-muted"></i>
  116 + <p>Liquidaciones</p>
  117 + </a>
  118 + </li>
  119 + <li class="nav-item">
  120 + <a href="#" class="nav-link" onclick="notImplemented()">
  121 + <i class="nav-icon fas fa-users text-muted"></i>
  122 + <p>Contribuyentes</p>
  123 + </a>
  124 + </li>
  125 +
  126 + </ul>
  127 + </nav>
  128 + <!-- /.sidebar-menu -->
  129 + </aside>
  130 +
  131 + <!-- Content Wrapper. Contains page content -->
  132 + <div class="content-wrapper">
  133 + <iframe id="main-iframe" src="/gis-geoserver/widgets"></iframe>
  134 + </div>
  135 +
  136 + <!-- Main Footer -->
  137 + <footer class="main-footer" style="padding: 5px; font-size: 12px;">
  138 + <strong>Sistema de Información Geográfica Municipal.</strong>
  139 + Todos los derechos reservados.
  140 + </footer>
  141 +</div>
  142 +<!-- ./wrapper -->
  143 +
  144 +<!-- Modal Pop-up para Selección de Mapa (Exactamente como el legado) -->
  145 +<div class="modal fade" id="modalMorosidad" tabindex="-1" role="dialog" aria-hidden="true">
  146 + <div class="modal-dialog modal-sm" role="document" style="margin-top: 15vh;">
  147 + <div class="modal-content shadow-lg" style="border: 1px solid #17a2b8;">
  148 + <div class="modal-header bg-info" style="padding: 10px;">
  149 + <h6 class="modal-title" style="font-weight: bold;"><i class="fas fa-filter"></i> Selección Capas Geo</h6>
  150 + <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
  151 + <span aria-hidden="true">&times;</span>
  152 + </button>
  153 + </div>
  154 + <div class="modal-body modal-treeview">
  155 + <ul>
  156 + <li><i class="fas fa-minus-square mr-1 text-secondary"></i> <span>MAPA DE MOROSIDAD</span>
  157 + <ul>
  158 + <li><i class="fas fa-plus-square mr-1 text-secondary"></i> <span>IMPUESTOS ADEUDADOS</span>
  159 + <ul>
  160 + <li><i class="fas fa-plus mr-1 text-muted"></i> <span class="clickable" onclick="notImplemented()">Impuesto Inmobiliario</span></li>
  161 + <li><i class="fas fa-plus mr-1 text-muted"></i> <span class="clickable" onclick="notImplemented()">Patente Comercial</span></li>
  162 + <li><i class="fas fa-plus-square mr-1 text-secondary"></i> <span>Todos</span>
  163 + <ul>
  164 + <li><i class="far fa-window-restore mr-1 text-muted"></i> <span class="clickable" onclick="notImplemented()">POR TOTAL</span></li>
  165 + <li><i class="far fa-clock mr-1 text-muted"></i> <span class="text-primary font-weight-bold clickable" onclick="loadMap()">ULTIMO PAGO / TODOS</span></li>
  166 + </ul>
  167 + </li>
  168 + </ul>
  169 + </li>
  170 + <li><i class="fas fa-plus-square mr-1 text-muted"></i> <span class="clickable" onclick="notImplemented()">IMPUESTOS PAGADOS</span></li>
  171 + </ul>
  172 + </li>
  173 + </ul>
  174 + </div>
  175 + </div>
  176 + </div>
  177 +</div>
  178 +
  179 +<!-- jQuery -->
  180 +<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  181 +<!-- Bootstrap 4 -->
  182 +<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
  183 +<!-- AdminLTE App -->
  184 +<script src="https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/js/adminlte.min.js"></script>
  185 +
  186 +<script>
  187 + // Recuperar datos de sesión
  188 + const token = localStorage.getItem('jwt');
  189 + const userName = localStorage.getItem('user_name');
  190 + const entidad = localStorage.getItem('entidad');
  191 +
  192 + if (!token) {
  193 + window.location.href = "/gis-geoserver/login";
  194 + }
  195 +
  196 + document.getElementById('nav-user-text').innerText = userName || 'Operador Local';
  197 + document.getElementById('nav-entidad-text').innerText = entidad || 'N/D';
  198 +
  199 + function notImplemented() {
  200 + alert("OPCIÓN NO IMPLEMENTADA");
  201 + }
  202 +
  203 + function loadContent(url) {
  204 + document.getElementById('main-iframe').src = url;
  205 + }
  206 +
  207 + function loadMap() {
  208 + // Cierra el modal de forma programática usando jQuery de Bootstrap
  209 + $('#modalMorosidad').modal('hide');
  210 + // Redirige el iframe central hacia nuestro impecable mapas.html
  211 + loadContent('/gis-geoserver/mapas');
  212 + }
  213 +
  214 + function cerrarSesion() {
  215 + localStorage.clear();
  216 + window.location.href = "/gis-geoserver/login";
  217 + }
  218 +</script>
  219 +</body>
  220 +</html>
GIS-GEOSERVER/src/main/resources/static/login.html
1 <!DOCTYPE html> 1 <!DOCTYPE html>
2 <html lang="es"> 2 <html lang="es">
3 <head> 3 <head>
4 - <meta charset="UTF-8">  
5 - <meta name="viewport" content="width=device-width, initial-scale=1.0">  
6 - <title>Inicie Sesión - Ecosistema SIGEM</title>  
7 - <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;800&display=swap" rel="stylesheet">  
8 - <style>  
9 - * { margin: 0; padding: 0; box-sizing: border-box; }  
10 - body {  
11 - font-family: 'Inter', sans-serif;  
12 - background: linear-gradient(-45deg, #0d1b2a, #1b263b, #415a77, #778da9);  
13 - background-size: 400% 400%;  
14 - animation: gradientBG 15s ease infinite;  
15 - height: 100vh;  
16 - display: flex;  
17 - justify-content: center;  
18 - align-items: center;  
19 - color: #fff;  
20 - }  
21 - @keyframes gradientBG {  
22 - 0% { background-position: 0% 50%; }  
23 - 50% { background-position: 100% 50%; }  
24 - 100% { background-position: 0% 50%; }  
25 - }  
26 - .login-container {  
27 - background: rgba(255, 255, 255, 0.05);  
28 - backdrop-filter: blur(20px);  
29 - -webkit-backdrop-filter: blur(20px);  
30 - border: 1px solid rgba(255, 255, 255, 0.1);  
31 - border-radius: 24px;  
32 - padding: 40px;  
33 - width: 100%;  
34 - max-width: 400px;  
35 - box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);  
36 - animation: slideUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards;  
37 - opacity: 0;  
38 - transform: translateY(30px);  
39 - }  
40 - @keyframes slideUp { to { opacity: 1; transform: translateY(0); } }  
41 - .logo-area { text-align: center; margin-bottom: 30px; }  
42 - .logo-area h1 { font-weight: 800; font-size: 28px; letter-spacing: -0.5px; }  
43 - .logo-area span { color: #facc15; }  
44 - .logo-area p { font-size: 14px; font-weight: 300; color: #cbd5e1; margin-top: 5px; }  
45 - .input-group { margin-bottom: 20px; }  
46 - .input-group label {  
47 - display: block; font-size: 13px; font-weight: 600; color: #94a3b8; margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.5px;  
48 - }  
49 - .input-group input, .input-group select {  
50 - width: 100%; padding: 14px 16px; background: rgba(0, 0, 0, 0.2); border: 1px solid rgba(255, 255, 255, 0.1);  
51 - border-radius: 12px; color: #fff; font-size: 15px; font-family: 'Inter', sans-serif; transition: all 0.3s ease;  
52 - }  
53 - .input-group select { appearance: none; cursor: pointer; }  
54 - .input-group select option { color: #000; }  
55 - .input-group input:focus, .input-group select:focus {  
56 - outline: none; border-color: #facc15; background: rgba(0, 0, 0, 0.4); box-shadow: 0 0 0 3px rgba(250, 204, 21, 0.2);  
57 - }  
58 - .btn-submit {  
59 - width: 100%; padding: 16px; background: linear-gradient(135deg, #eab308, #ca8a04);  
60 - color: #000; border: none; border-radius: 12px; font-size: 16px; font-weight: 700; cursor: pointer;  
61 - transition: transform 0.2s, box-shadow 0.2s; box-shadow: 0 10px 15px -3px rgba(234, 179, 8, 0.3);  
62 - margin-top: 10px;  
63 - }  
64 - .btn-submit:hover { transform: translateY(-2px); box-shadow: 0 15px 25px -5px rgba(234, 179, 8, 0.4); }  
65 - .btn-submit:active { transform: translateY(0); }  
66 -  
67 - #error-msg {  
68 - display: none; color: #fca5a5; font-size: 14px; font-weight: 600; text-align: center;  
69 - background: rgba(239, 68, 68, 0.2); padding: 10px; border-radius: 8px; margin-top: 15px; border: 1px solid rgba(239, 68, 68, 0.3);  
70 - }  
71 -  
72 - .loader {  
73 - display: none; border: 3px solid rgba(0, 0, 0, 0.1); border-radius: 50%;  
74 - border-top: 3px solid #000; width: 24px; height: 24px; animation: spin 1s linear infinite; margin: 0 auto;  
75 - }  
76 - @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }  
77 - </style>  
78 -</head>  
79 -<body> 4 + <meta charset="utf-8">
  5 + <meta name="viewport" content="width=device-width, initial-scale=1">
  6 + <title>Inicie Sesión - Ecosistema SIGEM</title>
80 7
81 -<div class="login-container">  
82 - <div class="logo-area">  
83 - <h1>SIGEM<span>WEB</span></h1>  
84 - <p>Visor Georreferenciado Multi-Tenant</p>  
85 - </div> 8 + <!-- Google Font: Source Sans Pro (Estandar de AdminLTE) -->
  9 + <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
  10 + <!-- Font Awesome -->
  11 + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
  12 + <!-- Theme style AdminLTE 3 -->
  13 + <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/css/adminlte.min.css">
  14 + <style>
  15 + .login-page {
  16 + background: linear-gradient(135deg, #e0eafc 0%, #cfdef3 100%);
  17 + }
  18 + .card-primary.card-outline {
  19 + border-top: 3px solid #0056b3;
  20 + }
  21 + .btn-primary {
  22 + background-color: #0056b3;
  23 + border-color: #0056b3;
  24 + }
  25 + .btn-primary:hover {
  26 + background-color: #004494;
  27 + border-color: #004494;
  28 + }
  29 + .login-logo a {
  30 + color: #333 !important;
  31 + }
  32 + </style>
  33 +</head>
  34 +<body class="hold-transition login-page">
  35 +<div class="login-box">
  36 + <div class="login-logo">
  37 + <a href="#"><b>SIGEM</b>WEB</a>
  38 + </div>
  39 + <!-- /.login-logo -->
  40 + <div class="card card-outline card-primary shadow-lg">
  41 + <div class="card-body login-card-body rounded">
  42 + <p class="login-box-msg font-weight-bold" style="color: #555;">Visor Georreferenciado Multi-Tenant</p>
86 43
87 - <form id="loginForm">  
88 - <div class="input-group">  
89 - <label for="municipioSearch">Municipalidad (Entidad)</label>  
90 - <input type="text" id="municipioSearch" placeholder="Escriba para buscar (ej. 505)" autocomplete="off" style="margin-bottom: 5px;">  
91 - <select id="entidad" required size="3" style="height: 100px; overflow-y: auto;"> 44 + <form id="loginForm">
  45 + <label for="municipioSearch" class="text-xs text-muted mb-1" style="font-size: 0.8rem; text-transform: uppercase;">1. Entidad (Municipalidad)</label>
  46 + <div class="input-group mb-2">
  47 + <input type="text" id="municipioSearch" class="form-control" placeholder="Buscar municipio (ej. 505)" autocomplete="off">
  48 + <div class="input-group-append">
  49 + <div class="input-group-text">
  50 + <span class="fas fa-search"></span>
  51 + </div>
  52 + </div>
  53 + </div>
  54 + <div class="form-group mb-3">
  55 + <select id="entidad" class="form-control" required size="3" style="height: 85px; cursor: pointer; font-size: 0.9rem;">
92 <option value="505">Entidad 505 (Piloto GIS)</option> 56 <option value="505">Entidad 505 (Piloto GIS)</option>
93 <option value="800">Entidad 800 (Pruebas)</option> 57 <option value="800">Entidad 800 (Pruebas)</option>
94 <option value="900">Entidad 900 (Desarrollo)</option> 58 <option value="900">Entidad 900 (Desarrollo)</option>
95 - </select>  
96 - <p style="font-size: 11px; color: #94a3b8; margin-top: 5px;">Seleccione de la lista superior</p> 59 + </select>
97 </div> 60 </div>
98 - <div class="input-group">  
99 - <label for="username">Usuario</label>  
100 - <input type="text" id="username" placeholder="Usu_alias (ej. operador)" required autocomplete="username"> 61 +
  62 + <label class="text-xs text-muted mb-1" style="font-size: 0.8rem; text-transform: uppercase;">2. Credenciales</label>
  63 + <div class="input-group mb-3">
  64 + <input type="text" id="username" class="form-control" placeholder="Usu_alias (ej. operador)" required autocomplete="username">
  65 + <div class="input-group-append">
  66 + <div class="input-group-text">
  67 + <span class="fas fa-user"></span>
  68 + </div>
  69 + </div>
101 </div> 70 </div>
102 - <div class="input-group">  
103 - <label for="password">Contraseña</label>  
104 - <input type="password" id="password" placeholder="Tu clave alfanumérica" required autocomplete="current-password"> 71 + <div class="input-group mb-3">
  72 + <input type="password" id="password" class="form-control" placeholder="Tu clave alfanumérica" required autocomplete="current-password">
  73 + <div class="input-group-append">
  74 + <div class="input-group-text">
  75 + <span class="fas fa-lock"></span>
  76 + </div>
  77 + </div>
105 </div> 78 </div>
106 -  
107 - <button type="submit" class="btn-submit" id="btn-login">  
108 - <span id="btn-text">INICIAR SESIÓN</span>  
109 - <div class="loader" id="spinner"></div>  
110 - </button>  
111 -  
112 - <div id="error-msg"></div>  
113 - </form> 79 +
  80 + <div id="error-msg" class="alert alert-danger p-2 mb-3 text-center" style="display:none; font-size: 13px;"></div>
  81 +
  82 + <div class="row mt-4">
  83 + <div class="col-12">
  84 + <button type="submit" class="btn btn-primary btn-block font-weight-bold" id="btn-login" style="padding: 10px;">
  85 + <span id="btn-text">INICIAR SESIÓN</span>
  86 + <div class="spinner-border spinner-border-sm text-light" id="spinner" role="status" style="display:none; margin: auto;"></div>
  87 + </button>
  88 + </div>
  89 + </div>
  90 + </form>
  91 + </div>
  92 + <!-- /.login-card-body -->
  93 + </div>
114 </div> 94 </div>
  95 +<!-- /.login-box -->
  96 +
  97 +<!-- jQuery -->
  98 +<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  99 +<!-- Bootstrap 4 -->
  100 +<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
  101 +<!-- AdminLTE App -->
  102 +<script src="https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/js/adminlte.min.js"></script>
115 103
116 <script> 104 <script>
117 // Filtro interactivo de municipios 105 // Filtro interactivo de municipios
@@ -134,6 +122,7 @@ @@ -134,6 +122,7 @@
134 122
135 // Limpiar sesión previa si por error caen al login 123 // Limpiar sesión previa si por error caen al login
136 localStorage.removeItem('jwt'); 124 localStorage.removeItem('jwt');
  125 + localStorage.removeItem('user_name');
137 126
138 document.getElementById('loginForm').addEventListener('submit', function(e) { 127 document.getElementById('loginForm').addEventListener('submit', function(e) {
139 e.preventDefault(); 128 e.preventDefault();
@@ -185,8 +174,8 @@ @@ -185,8 +174,8 @@
185 localStorage.setItem('mapa_base_id', data.mapaBase); 174 localStorage.setItem('mapa_base_id', data.mapaBase);
186 localStorage.setItem('map_bounds', data.bounds); 175 localStorage.setItem('map_bounds', data.bounds);
187 176
188 - // Redirigir a la URL del Mapas de Leaflet  
189 - window.location.href = "/gis-geoserver/mapas"; 177 + // Redirigir a la URL del Mapas
  178 + window.location.href = "/gis-geoserver/landing";
190 }) 179 })
191 .catch(error => { 180 .catch(error => {
192 // LOGIN ERROR 181 // LOGIN ERROR
@@ -200,6 +189,5 @@ @@ -200,6 +189,5 @@
200 }); 189 });
201 }); 190 });
202 </script> 191 </script>
203 -  
204 </body> 192 </body>
205 </html> 193 </html>
GIS-GEOSERVER/src/main/resources/static/widgets.html 0 → 100644
  1 +<!DOCTYPE html>
  2 +<html lang="es">
  3 +<head>
  4 + <meta charset="utf-8">
  5 + <meta name="viewport" content="width=device-width, initial-scale=1">
  6 + <!-- Google Font: Source Sans Pro -->
  7 + <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
  8 + <!-- Font Awesome -->
  9 + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
  10 + <!-- Theme style AdminLTE 3 -->
  11 + <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/css/adminlte.min.css">
  12 + <style>
  13 + body { background-color: #f4f6f9; padding: 20px; font-family: 'Source Sans Pro', sans-serif; }
  14 + .welcome-header { font-size: 24px; color: #333; margin-bottom: 20px; font-weight: 600;}
  15 + </style>
  16 +</head>
  17 +<body>
  18 + <div class="welcome-header">
  19 + <i class="fas fa-home text-primary"></i> Tablero General (Estadísticas Simuladas)
  20 + </div>
  21 +
  22 + <div class="row">
  23 + <!-- Tarjeta 1 -->
  24 + <div class="col-lg-3 col-6">
  25 + <div class="small-box bg-info shadow-sm">
  26 + <div class="inner">
  27 + <h3>99,999</h3>
  28 + <p>Lotes Registrados</p>
  29 + </div>
  30 + <div class="icon">
  31 + <i class="fas fa-map-marked-alt"></i>
  32 + </div>
  33 + <a href="#" class="small-box-footer" onclick="alert('OPCIÓN NO IMPLEMENTADA')">Más info <i class="fas fa-arrow-circle-right"></i></a>
  34 + </div>
  35 + </div>
  36 + <!-- Tarjeta 2 -->
  37 + <div class="col-lg-3 col-6">
  38 + <div class="small-box bg-success shadow-sm">
  39 + <div class="inner">
  40 + <h3>Gs. ---<sup style="font-size: 20px"></sup></h3>
  41 + <p>Recaudación del Día</p>
  42 + </div>
  43 + <div class="icon">
  44 + <i class="fas fa-hand-holding-usd"></i>
  45 + </div>
  46 + <a href="#" class="small-box-footer" onclick="alert('OPCIÓN NO IMPLEMENTADA')">Más info <i class="fas fa-arrow-circle-right"></i></a>
  47 + </div>
  48 + </div>
  49 +
  50 + <!-- Tarjeta 3 -->
  51 + <div class="col-lg-3 col-6">
  52 + <div class="small-box bg-warning shadow-sm">
  53 + <div class="inner">
  54 + <h3>---</h3>
  55 + <p>Nuevas Actividades Comerciales</p>
  56 + </div>
  57 + <div class="icon">
  58 + <i class="fas fa-store"></i>
  59 + </div>
  60 + <a href="#" class="small-box-footer" onclick="alert('OPCIÓN NO IMPLEMENTADA')">Más info <i class="fas fa-arrow-circle-right"></i></a>
  61 + </div>
  62 + </div>
  63 + <!-- Tarjeta 4 -->
  64 + <div class="col-lg-3 col-6">
  65 + <div class="small-box bg-danger shadow-sm">
  66 + <div class="inner">
  67 + <h3>45%</h3>
  68 + <p>Índice General de Morosidad</p>
  69 + </div>
  70 + <div class="icon">
  71 + <i class="fas fa-chart-pie"></i>
  72 + </div>
  73 + <a href="#" class="small-box-footer" onclick="alert('OPCIÓN NO IMPLEMENTADA')">Más info <i class="fas fa-arrow-circle-right"></i></a>
  74 + </div>
  75 + </div>
  76 + </div>
  77 +
  78 + <div class="row mt-4">
  79 + <div class="col-12">
  80 + <div class="card card-outline card-primary shadow-sm" style="border-top: 3px solid #0056b3;">
  81 + <div class="card-header">
  82 + <h3 class="card-title text-muted"><i class="fas fa-info-circle mr-1"></i> Estado del Sistema</h3>
  83 + </div>
  84 + <div class="card-body">
  85 + <p class="text-secondary text-sm">Use el menú lateral para navegar por los distintos módulos administrativos. La funcionalidad de Mapas Tributarios se encuentra activa bajo "Control de Gestión -> Mapas". Otras opciones en despliegue.</p>
  86 + </div>
  87 + </div>
  88 + </div>
  89 + </div>
  90 +
  91 +<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  92 +<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
  93 +</body>
  94 +</html>
GIS-GEOSERVER/target/classes/com/sigem/gis/controller/WebViewController.class
No preview for this file type
GIS-GEOSERVER/target/classes/com/sigem/gis/security/SecurityConfig.class
No preview for this file type
GIS-GEOSERVER/target/classes/static/landing.html 0 → 100644
  1 +<!DOCTYPE html>
  2 +<html lang="es">
  3 +<head>
  4 + <meta charset="utf-8">
  5 + <meta name="viewport" content="width=device-width, initial-scale=1">
  6 + <title>SIGEMWEB - Dashboard</title>
  7 +
  8 + <!-- Google Font: Source Sans Pro -->
  9 + <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
  10 + <!-- Font Awesome -->
  11 + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
  12 + <!-- Theme style -->
  13 + <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/css/adminlte.min.css">
  14 + <style>
  15 + .content-wrapper { padding: 0; margin-left: 250px; height: calc(100vh - 57px); overflow: hidden; }
  16 + iframe#main-iframe { width: 100%; height: 100%; border: none; }
  17 + .brand-link { background-color: #0056b3 !important; color: white !important; font-weight: bold;}
  18 + .main-header { background-color: #006ddb !important; border-bottom: none; }
  19 + .navbar-light .navbar-nav .nav-link { color: white; font-weight: 600;}
  20 + /* Treeview in popup */
  21 + .modal-treeview ul { list-style-type: none; padding-left: 20px; }
  22 + .modal-treeview li { margin-bottom: 5px; cursor: default;}
  23 + .modal-treeview li span { font-size: 14px; font-weight: 500; }
  24 + .modal-treeview li span.clickable:hover { color: #0056b3; cursor: pointer; font-weight: bold; }
  25 + </style>
  26 +</head>
  27 +<body class="hold-transition sidebar-mini layout-fixed">
  28 +<div class="wrapper">
  29 +
  30 + <!-- Navbar -->
  31 + <nav class="main-header navbar navbar-expand navbar-light">
  32 + <!-- Left navbar links -->
  33 + <ul class="navbar-nav">
  34 + <li class="nav-item">
  35 + <a class="nav-link" data-widget="pushmenu" href="#" role="button"><i class="fas fa-bars"></i></a>
  36 + </li>
  37 + <li class="nav-item d-none d-sm-inline-block">
  38 + <span class="nav-link" style="color: white; font-size: 18px; margin-left:10px;">Municipalidad de <span id="nav-entidad-text" style="font-weight: 800;">...</span> <span style="font-size: 14px; font-weight: 300;">¡Emergente y Sostenible!</span></span>
  39 + </li>
  40 + </ul>
  41 +
  42 + <!-- Right navbar links -->
  43 + <ul class="navbar-nav ml-auto">
  44 + <li class="nav-item dropdown">
  45 + <a class="nav-link" data-toggle="dropdown" href="#" style="color: white;">
  46 + <i class="far fa-user mr-2"></i> <span id="nav-user-text">Cargando...</span>
  47 + </a>
  48 + <div class="dropdown-menu dropdown-menu-lg dropdown-menu-right">
  49 + <a href="#" class="dropdown-item" onclick="cerrarSesion()">
  50 + <i class="fas fa-sign-out-alt mr-2 text-danger"></i> Cerrar Sesión
  51 + </a>
  52 + </div>
  53 + </li>
  54 + </ul>
  55 + </nav>
  56 + <!-- /.navbar -->
  57 +
  58 + <!-- Main Sidebar Container -->
  59 + <aside class="main-sidebar sidebar-dark-primary elevation-4">
  60 + <!-- Brand Logo -->
  61 + <a href="#" class="brand-link text-center mb-2">
  62 + <span class="brand-text"><b>SIGEM</b>WEB</span>
  63 + </a>
  64 +
  65 + <!-- Sidebar Menu -->
  66 + <nav class="mt-2">
  67 + <ul class="nav nav-pills nav-sidebar flex-column text-sm" data-widget="treeview" role="menu" data-accordion="false">
  68 +
  69 + <li class="nav-item">
  70 + <a href="#" class="nav-link" onclick="loadContent('/gis-geoserver/widgets')">
  71 + <i class="nav-icon fas fa-tachometer-alt"></i>
  72 + <p>Dashboard <span class="right badge badge-primary">New</span></p>
  73 + </a>
  74 + </li>
  75 +
  76 + <!-- Legacy Tree -->
  77 + <li class="nav-item menu-open">
  78 + <a href="#" class="nav-link active" style="background-color: #343a40;">
  79 + <i class="nav-icon fas fa-chart-line"></i>
  80 + <p>
  81 + Control de Gestión
  82 + <i class="right fas fa-angle-left"></i>
  83 + </p>
  84 + </a>
  85 + <ul class="nav nav-treeview">
  86 + <li class="nav-item menu-open">
  87 + <a href="#" class="nav-link">
  88 + <i class="far fa-dot-circle nav-icon"></i>
  89 + <p>Mapas <i class="right fas fa-angle-left"></i></p>
  90 + </a>
  91 + <ul class="nav nav-treeview" style="margin-left: 10px;">
  92 + <li class="nav-item menu-open">
  93 + <a href="#" class="nav-link">
  94 + <i class="fas fa-map nav-icon text-info"></i>
  95 + <p>Tributarios <i class="right fas fa-angle-left"></i></p>
  96 + </a>
  97 + <ul class="nav nav-treeview" style="margin-left: 10px;">
  98 + <li class="nav-item">
  99 + <a href="#" class="nav-link" data-toggle="modal" data-target="#modalMorosidad">
  100 + <i class="fas fa-layer-group nav-icon text-warning"></i>
  101 + <p>Mapa Morosidad/Pago</p>
  102 + </a>
  103 + </li>
  104 + </ul>
  105 + </li>
  106 + </ul>
  107 + </li>
  108 + </ul>
  109 + </li>
  110 +
  111 + <!-- Dummy Options -->
  112 + <li class="nav-header">OTRAS OPCIONES</li>
  113 + <li class="nav-item">
  114 + <a href="#" class="nav-link" onclick="notImplemented()">
  115 + <i class="nav-icon fas fa-file-invoice-dollar text-muted"></i>
  116 + <p>Liquidaciones</p>
  117 + </a>
  118 + </li>
  119 + <li class="nav-item">
  120 + <a href="#" class="nav-link" onclick="notImplemented()">
  121 + <i class="nav-icon fas fa-users text-muted"></i>
  122 + <p>Contribuyentes</p>
  123 + </a>
  124 + </li>
  125 +
  126 + </ul>
  127 + </nav>
  128 + <!-- /.sidebar-menu -->
  129 + </aside>
  130 +
  131 + <!-- Content Wrapper. Contains page content -->
  132 + <div class="content-wrapper">
  133 + <iframe id="main-iframe" src="/gis-geoserver/widgets"></iframe>
  134 + </div>
  135 +
  136 + <!-- Main Footer -->
  137 + <footer class="main-footer" style="padding: 5px; font-size: 12px;">
  138 + <strong>Sistema de Información Geográfica Municipal.</strong>
  139 + Todos los derechos reservados.
  140 + </footer>
  141 +</div>
  142 +<!-- ./wrapper -->
  143 +
  144 +<!-- Modal Pop-up para Selección de Mapa (Exactamente como el legado) -->
  145 +<div class="modal fade" id="modalMorosidad" tabindex="-1" role="dialog" aria-hidden="true">
  146 + <div class="modal-dialog modal-sm" role="document" style="margin-top: 15vh;">
  147 + <div class="modal-content shadow-lg" style="border: 1px solid #17a2b8;">
  148 + <div class="modal-header bg-info" style="padding: 10px;">
  149 + <h6 class="modal-title" style="font-weight: bold;"><i class="fas fa-filter"></i> Selección Capas Geo</h6>
  150 + <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
  151 + <span aria-hidden="true">&times;</span>
  152 + </button>
  153 + </div>
  154 + <div class="modal-body modal-treeview">
  155 + <ul>
  156 + <li><i class="fas fa-minus-square mr-1 text-secondary"></i> <span>MAPA DE MOROSIDAD</span>
  157 + <ul>
  158 + <li><i class="fas fa-plus-square mr-1 text-secondary"></i> <span>IMPUESTOS ADEUDADOS</span>
  159 + <ul>
  160 + <li><i class="fas fa-plus mr-1 text-muted"></i> <span class="clickable" onclick="notImplemented()">Impuesto Inmobiliario</span></li>
  161 + <li><i class="fas fa-plus mr-1 text-muted"></i> <span class="clickable" onclick="notImplemented()">Patente Comercial</span></li>
  162 + <li><i class="fas fa-plus-square mr-1 text-secondary"></i> <span>Todos</span>
  163 + <ul>
  164 + <li><i class="far fa-window-restore mr-1 text-muted"></i> <span class="clickable" onclick="notImplemented()">POR TOTAL</span></li>
  165 + <li><i class="far fa-clock mr-1 text-muted"></i> <span class="text-primary font-weight-bold clickable" onclick="loadMap()">ULTIMO PAGO / TODOS</span></li>
  166 + </ul>
  167 + </li>
  168 + </ul>
  169 + </li>
  170 + <li><i class="fas fa-plus-square mr-1 text-muted"></i> <span class="clickable" onclick="notImplemented()">IMPUESTOS PAGADOS</span></li>
  171 + </ul>
  172 + </li>
  173 + </ul>
  174 + </div>
  175 + </div>
  176 + </div>
  177 +</div>
  178 +
  179 +<!-- jQuery -->
  180 +<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  181 +<!-- Bootstrap 4 -->
  182 +<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
  183 +<!-- AdminLTE App -->
  184 +<script src="https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/js/adminlte.min.js"></script>
  185 +
  186 +<script>
  187 + // Recuperar datos de sesión
  188 + const token = localStorage.getItem('jwt');
  189 + const userName = localStorage.getItem('user_name');
  190 + const entidad = localStorage.getItem('entidad');
  191 +
  192 + if (!token) {
  193 + window.location.href = "/gis-geoserver/login";
  194 + }
  195 +
  196 + document.getElementById('nav-user-text').innerText = userName || 'Operador Local';
  197 + document.getElementById('nav-entidad-text').innerText = entidad || 'N/D';
  198 +
  199 + function notImplemented() {
  200 + alert("OPCIÓN NO IMPLEMENTADA");
  201 + }
  202 +
  203 + function loadContent(url) {
  204 + document.getElementById('main-iframe').src = url;
  205 + }
  206 +
  207 + function loadMap() {
  208 + // Cierra el modal de forma programática usando jQuery de Bootstrap
  209 + $('#modalMorosidad').modal('hide');
  210 + // Redirige el iframe central hacia nuestro impecable mapas.html
  211 + loadContent('/gis-geoserver/mapas');
  212 + }
  213 +
  214 + function cerrarSesion() {
  215 + localStorage.clear();
  216 + window.location.href = "/gis-geoserver/login";
  217 + }
  218 +</script>
  219 +</body>
  220 +</html>
GIS-GEOSERVER/target/classes/static/login.html
1 <!DOCTYPE html> 1 <!DOCTYPE html>
2 <html lang="es"> 2 <html lang="es">
3 <head> 3 <head>
4 - <meta charset="UTF-8">  
5 - <meta name="viewport" content="width=device-width, initial-scale=1.0">  
6 - <title>Inicie Sesión - Ecosistema SIGEM</title>  
7 - <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;800&display=swap" rel="stylesheet">  
8 - <style>  
9 - * { margin: 0; padding: 0; box-sizing: border-box; }  
10 - body {  
11 - font-family: 'Inter', sans-serif;  
12 - background: linear-gradient(-45deg, #0d1b2a, #1b263b, #415a77, #778da9);  
13 - background-size: 400% 400%;  
14 - animation: gradientBG 15s ease infinite;  
15 - height: 100vh;  
16 - display: flex;  
17 - justify-content: center;  
18 - align-items: center;  
19 - color: #fff;  
20 - }  
21 - @keyframes gradientBG {  
22 - 0% { background-position: 0% 50%; }  
23 - 50% { background-position: 100% 50%; }  
24 - 100% { background-position: 0% 50%; }  
25 - }  
26 - .login-container {  
27 - background: rgba(255, 255, 255, 0.05);  
28 - backdrop-filter: blur(20px);  
29 - -webkit-backdrop-filter: blur(20px);  
30 - border: 1px solid rgba(255, 255, 255, 0.1);  
31 - border-radius: 24px;  
32 - padding: 40px;  
33 - width: 100%;  
34 - max-width: 400px;  
35 - box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);  
36 - animation: slideUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards;  
37 - opacity: 0;  
38 - transform: translateY(30px);  
39 - }  
40 - @keyframes slideUp { to { opacity: 1; transform: translateY(0); } }  
41 - .logo-area { text-align: center; margin-bottom: 30px; }  
42 - .logo-area h1 { font-weight: 800; font-size: 28px; letter-spacing: -0.5px; }  
43 - .logo-area span { color: #facc15; }  
44 - .logo-area p { font-size: 14px; font-weight: 300; color: #cbd5e1; margin-top: 5px; }  
45 - .input-group { margin-bottom: 20px; }  
46 - .input-group label {  
47 - display: block; font-size: 13px; font-weight: 600; color: #94a3b8; margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.5px;  
48 - }  
49 - .input-group input, .input-group select {  
50 - width: 100%; padding: 14px 16px; background: rgba(0, 0, 0, 0.2); border: 1px solid rgba(255, 255, 255, 0.1);  
51 - border-radius: 12px; color: #fff; font-size: 15px; font-family: 'Inter', sans-serif; transition: all 0.3s ease;  
52 - }  
53 - .input-group select { appearance: none; cursor: pointer; }  
54 - .input-group select option { color: #000; }  
55 - .input-group input:focus, .input-group select:focus {  
56 - outline: none; border-color: #facc15; background: rgba(0, 0, 0, 0.4); box-shadow: 0 0 0 3px rgba(250, 204, 21, 0.2);  
57 - }  
58 - .btn-submit {  
59 - width: 100%; padding: 16px; background: linear-gradient(135deg, #eab308, #ca8a04);  
60 - color: #000; border: none; border-radius: 12px; font-size: 16px; font-weight: 700; cursor: pointer;  
61 - transition: transform 0.2s, box-shadow 0.2s; box-shadow: 0 10px 15px -3px rgba(234, 179, 8, 0.3);  
62 - margin-top: 10px;  
63 - }  
64 - .btn-submit:hover { transform: translateY(-2px); box-shadow: 0 15px 25px -5px rgba(234, 179, 8, 0.4); }  
65 - .btn-submit:active { transform: translateY(0); }  
66 -  
67 - #error-msg {  
68 - display: none; color: #fca5a5; font-size: 14px; font-weight: 600; text-align: center;  
69 - background: rgba(239, 68, 68, 0.2); padding: 10px; border-radius: 8px; margin-top: 15px; border: 1px solid rgba(239, 68, 68, 0.3);  
70 - }  
71 -  
72 - .loader {  
73 - display: none; border: 3px solid rgba(0, 0, 0, 0.1); border-radius: 50%;  
74 - border-top: 3px solid #000; width: 24px; height: 24px; animation: spin 1s linear infinite; margin: 0 auto;  
75 - }  
76 - @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }  
77 - </style>  
78 -</head>  
79 -<body> 4 + <meta charset="utf-8">
  5 + <meta name="viewport" content="width=device-width, initial-scale=1">
  6 + <title>Inicie Sesión - Ecosistema SIGEM</title>
80 7
81 -<div class="login-container">  
82 - <div class="logo-area">  
83 - <h1>SIGEM<span>WEB</span></h1>  
84 - <p>Visor Georreferenciado Multi-Tenant</p>  
85 - </div> 8 + <!-- Google Font: Source Sans Pro (Estandar de AdminLTE) -->
  9 + <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
  10 + <!-- Font Awesome -->
  11 + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
  12 + <!-- Theme style AdminLTE 3 -->
  13 + <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/css/adminlte.min.css">
  14 + <style>
  15 + .login-page {
  16 + background: linear-gradient(135deg, #e0eafc 0%, #cfdef3 100%);
  17 + }
  18 + .card-primary.card-outline {
  19 + border-top: 3px solid #0056b3;
  20 + }
  21 + .btn-primary {
  22 + background-color: #0056b3;
  23 + border-color: #0056b3;
  24 + }
  25 + .btn-primary:hover {
  26 + background-color: #004494;
  27 + border-color: #004494;
  28 + }
  29 + .login-logo a {
  30 + color: #333 !important;
  31 + }
  32 + </style>
  33 +</head>
  34 +<body class="hold-transition login-page">
  35 +<div class="login-box">
  36 + <div class="login-logo">
  37 + <a href="#"><b>SIGEM</b>WEB</a>
  38 + </div>
  39 + <!-- /.login-logo -->
  40 + <div class="card card-outline card-primary shadow-lg">
  41 + <div class="card-body login-card-body rounded">
  42 + <p class="login-box-msg font-weight-bold" style="color: #555;">Visor Georreferenciado Multi-Tenant</p>
86 43
87 - <form id="loginForm">  
88 - <div class="input-group">  
89 - <label for="municipioSearch">Municipalidad (Entidad)</label>  
90 - <input type="text" id="municipioSearch" placeholder="Escriba para buscar (ej. 505)" autocomplete="off" style="margin-bottom: 5px;">  
91 - <select id="entidad" required size="3" style="height: 100px; overflow-y: auto;"> 44 + <form id="loginForm">
  45 + <label for="municipioSearch" class="text-xs text-muted mb-1" style="font-size: 0.8rem; text-transform: uppercase;">1. Entidad (Municipalidad)</label>
  46 + <div class="input-group mb-2">
  47 + <input type="text" id="municipioSearch" class="form-control" placeholder="Buscar municipio (ej. 505)" autocomplete="off">
  48 + <div class="input-group-append">
  49 + <div class="input-group-text">
  50 + <span class="fas fa-search"></span>
  51 + </div>
  52 + </div>
  53 + </div>
  54 + <div class="form-group mb-3">
  55 + <select id="entidad" class="form-control" required size="3" style="height: 85px; cursor: pointer; font-size: 0.9rem;">
92 <option value="505">Entidad 505 (Piloto GIS)</option> 56 <option value="505">Entidad 505 (Piloto GIS)</option>
93 <option value="800">Entidad 800 (Pruebas)</option> 57 <option value="800">Entidad 800 (Pruebas)</option>
94 <option value="900">Entidad 900 (Desarrollo)</option> 58 <option value="900">Entidad 900 (Desarrollo)</option>
95 - </select>  
96 - <p style="font-size: 11px; color: #94a3b8; margin-top: 5px;">Seleccione de la lista superior</p> 59 + </select>
97 </div> 60 </div>
98 - <div class="input-group">  
99 - <label for="username">Usuario</label>  
100 - <input type="text" id="username" placeholder="Usu_alias (ej. operador)" required autocomplete="username"> 61 +
  62 + <label class="text-xs text-muted mb-1" style="font-size: 0.8rem; text-transform: uppercase;">2. Credenciales</label>
  63 + <div class="input-group mb-3">
  64 + <input type="text" id="username" class="form-control" placeholder="Usu_alias (ej. operador)" required autocomplete="username">
  65 + <div class="input-group-append">
  66 + <div class="input-group-text">
  67 + <span class="fas fa-user"></span>
  68 + </div>
  69 + </div>
101 </div> 70 </div>
102 - <div class="input-group">  
103 - <label for="password">Contraseña</label>  
104 - <input type="password" id="password" placeholder="Tu clave alfanumérica" required autocomplete="current-password"> 71 + <div class="input-group mb-3">
  72 + <input type="password" id="password" class="form-control" placeholder="Tu clave alfanumérica" required autocomplete="current-password">
  73 + <div class="input-group-append">
  74 + <div class="input-group-text">
  75 + <span class="fas fa-lock"></span>
  76 + </div>
  77 + </div>
105 </div> 78 </div>
106 -  
107 - <button type="submit" class="btn-submit" id="btn-login">  
108 - <span id="btn-text">INICIAR SESIÓN</span>  
109 - <div class="loader" id="spinner"></div>  
110 - </button>  
111 -  
112 - <div id="error-msg"></div>  
113 - </form> 79 +
  80 + <div id="error-msg" class="alert alert-danger p-2 mb-3 text-center" style="display:none; font-size: 13px;"></div>
  81 +
  82 + <div class="row mt-4">
  83 + <div class="col-12">
  84 + <button type="submit" class="btn btn-primary btn-block font-weight-bold" id="btn-login" style="padding: 10px;">
  85 + <span id="btn-text">INICIAR SESIÓN</span>
  86 + <div class="spinner-border spinner-border-sm text-light" id="spinner" role="status" style="display:none; margin: auto;"></div>
  87 + </button>
  88 + </div>
  89 + </div>
  90 + </form>
  91 + </div>
  92 + <!-- /.login-card-body -->
  93 + </div>
114 </div> 94 </div>
  95 +<!-- /.login-box -->
  96 +
  97 +<!-- jQuery -->
  98 +<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  99 +<!-- Bootstrap 4 -->
  100 +<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
  101 +<!-- AdminLTE App -->
  102 +<script src="https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/js/adminlte.min.js"></script>
115 103
116 <script> 104 <script>
117 // Filtro interactivo de municipios 105 // Filtro interactivo de municipios
@@ -134,6 +122,7 @@ @@ -134,6 +122,7 @@
134 122
135 // Limpiar sesión previa si por error caen al login 123 // Limpiar sesión previa si por error caen al login
136 localStorage.removeItem('jwt'); 124 localStorage.removeItem('jwt');
  125 + localStorage.removeItem('user_name');
137 126
138 document.getElementById('loginForm').addEventListener('submit', function(e) { 127 document.getElementById('loginForm').addEventListener('submit', function(e) {
139 e.preventDefault(); 128 e.preventDefault();
@@ -185,8 +174,8 @@ @@ -185,8 +174,8 @@
185 localStorage.setItem('mapa_base_id', data.mapaBase); 174 localStorage.setItem('mapa_base_id', data.mapaBase);
186 localStorage.setItem('map_bounds', data.bounds); 175 localStorage.setItem('map_bounds', data.bounds);
187 176
188 - // Redirigir a la URL del Mapas de Leaflet  
189 - window.location.href = "/gis-geoserver/mapas"; 177 + // Redirigir a la URL del Mapas
  178 + window.location.href = "/gis-geoserver/landing";
190 }) 179 })
191 .catch(error => { 180 .catch(error => {
192 // LOGIN ERROR 181 // LOGIN ERROR
@@ -200,6 +189,5 @@ @@ -200,6 +189,5 @@
200 }); 189 });
201 }); 190 });
202 </script> 191 </script>
203 -  
204 </body> 192 </body>
205 </html> 193 </html>
GIS-GEOSERVER/target/classes/static/widgets.html 0 → 100644
  1 +<!DOCTYPE html>
  2 +<html lang="es">
  3 +<head>
  4 + <meta charset="utf-8">
  5 + <meta name="viewport" content="width=device-width, initial-scale=1">
  6 + <!-- Google Font: Source Sans Pro -->
  7 + <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
  8 + <!-- Font Awesome -->
  9 + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
  10 + <!-- Theme style AdminLTE 3 -->
  11 + <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/css/adminlte.min.css">
  12 + <style>
  13 + body { background-color: #f4f6f9; padding: 20px; font-family: 'Source Sans Pro', sans-serif; }
  14 + .welcome-header { font-size: 24px; color: #333; margin-bottom: 20px; font-weight: 600;}
  15 + </style>
  16 +</head>
  17 +<body>
  18 + <div class="welcome-header">
  19 + <i class="fas fa-home text-primary"></i> Tablero General (Estadísticas Simuladas)
  20 + </div>
  21 +
  22 + <div class="row">
  23 + <!-- Tarjeta 1 -->
  24 + <div class="col-lg-3 col-6">
  25 + <div class="small-box bg-info shadow-sm">
  26 + <div class="inner">
  27 + <h3>99,999</h3>
  28 + <p>Lotes Registrados</p>
  29 + </div>
  30 + <div class="icon">
  31 + <i class="fas fa-map-marked-alt"></i>
  32 + </div>
  33 + <a href="#" class="small-box-footer" onclick="alert('OPCIÓN NO IMPLEMENTADA')">Más info <i class="fas fa-arrow-circle-right"></i></a>
  34 + </div>
  35 + </div>
  36 + <!-- Tarjeta 2 -->
  37 + <div class="col-lg-3 col-6">
  38 + <div class="small-box bg-success shadow-sm">
  39 + <div class="inner">
  40 + <h3>Gs. ---<sup style="font-size: 20px"></sup></h3>
  41 + <p>Recaudación del Día</p>
  42 + </div>
  43 + <div class="icon">
  44 + <i class="fas fa-hand-holding-usd"></i>
  45 + </div>
  46 + <a href="#" class="small-box-footer" onclick="alert('OPCIÓN NO IMPLEMENTADA')">Más info <i class="fas fa-arrow-circle-right"></i></a>
  47 + </div>
  48 + </div>
  49 +
  50 + <!-- Tarjeta 3 -->
  51 + <div class="col-lg-3 col-6">
  52 + <div class="small-box bg-warning shadow-sm">
  53 + <div class="inner">
  54 + <h3>---</h3>
  55 + <p>Nuevas Actividades Comerciales</p>
  56 + </div>
  57 + <div class="icon">
  58 + <i class="fas fa-store"></i>
  59 + </div>
  60 + <a href="#" class="small-box-footer" onclick="alert('OPCIÓN NO IMPLEMENTADA')">Más info <i class="fas fa-arrow-circle-right"></i></a>
  61 + </div>
  62 + </div>
  63 + <!-- Tarjeta 4 -->
  64 + <div class="col-lg-3 col-6">
  65 + <div class="small-box bg-danger shadow-sm">
  66 + <div class="inner">
  67 + <h3>45%</h3>
  68 + <p>Índice General de Morosidad</p>
  69 + </div>
  70 + <div class="icon">
  71 + <i class="fas fa-chart-pie"></i>
  72 + </div>
  73 + <a href="#" class="small-box-footer" onclick="alert('OPCIÓN NO IMPLEMENTADA')">Más info <i class="fas fa-arrow-circle-right"></i></a>
  74 + </div>
  75 + </div>
  76 + </div>
  77 +
  78 + <div class="row mt-4">
  79 + <div class="col-12">
  80 + <div class="card card-outline card-primary shadow-sm" style="border-top: 3px solid #0056b3;">
  81 + <div class="card-header">
  82 + <h3 class="card-title text-muted"><i class="fas fa-info-circle mr-1"></i> Estado del Sistema</h3>
  83 + </div>
  84 + <div class="card-body">
  85 + <p class="text-secondary text-sm">Use el menú lateral para navegar por los distintos módulos administrativos. La funcionalidad de Mapas Tributarios se encuentra activa bajo "Control de Gestión -> Mapas". Otras opciones en despliegue.</p>
  86 + </div>
  87 + </div>
  88 + </div>
  89 + </div>
  90 +
  91 +<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  92 +<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
  93 +</body>
  94 +</html>
GitLab Appliance - Powered by TurnKey Linux