avansando más

This commit is contained in:
2025-04-17 13:24:07 -03:00
parent 6fb6ade153
commit c1a27baedd
15 changed files with 477 additions and 262 deletions

View File

@@ -1,170 +1,174 @@
<script lang="ts">
import 'bootstrap/dist/css/bootstrap.min.css';
import Login from "./paginas/login.svelte";
import { Router, Route, link } from 'svelte-routing';
import MenuPage from './paginas/menu.svelte';
import ProteRoute from './Componentes/RutaProtegida.svelte';
import InfoPage from './paginas/info.svelte';
import InqPage from "./paginas/inquilino.svelte";
import PropPage from "./paginas/propietario.svelte";
import MisPropiedades from "./paginas/MisPropiedades.svelte";
import MisPropiedadesDeBaja from "./paginas/MisPropiedadesDeBaja.svelte";
import FrontAdmin from "./paginas/grupos/AdminG.svelte";
import FrontInformes from "./paginas/grupos/InformesG.svelte";
import FrontInquilino from "./paginas/grupos/InquilinoG.svelte";
import FrontPropietario from "./paginas/grupos/PropietarioG.svelte";
import PublicarPropiedad from "./paginas/PublicarPropiedad.svelte";
import BusquedaPropiedades from "./paginas/BusquedaPropiedades.svelte";
import AdminUsuarios from "./paginas/AdminUsuarios.svelte";
import AdminPropiedades from "./paginas/AdminPropiedades.svelte";
import Notificaciones from "./paginas/Notificaciones.svelte";
import ControlAlquileresInquilino from "./paginas/ControlAlquileresInquilino.svelte";
import ControlAlquileresPropietario from "./paginas/ControlAlquileresPropietario.svelte";
import ContratosPropietario from "./paginas/ContratosPropietario.svelte";
import ContratoInquilino from "./paginas/ContratoInquilino.svelte";
import Informes from "./paginas/Informes.svelte";
import CompraYVentas from "./paginas/CompraYVenta.svelte";
import Ventas from "./paginas/Ventas.svelte";
import "bootstrap/dist/css/bootstrap.min.css";
import Login from "./paginas/login.svelte";
import { Router, Route, link } from "svelte-routing";
import MenuPage from "./paginas/menu.svelte";
import ProteRoute from "./Componentes/RutaProtegida.svelte";
import InfoPage from "./paginas/info.svelte";
import InqPage from "./paginas/inquilino.svelte";
import PropPage from "./paginas/propietario.svelte";
import MisPropiedades from "./paginas/MisPropiedades.svelte";
import MisPropiedadesDeBaja from "./paginas/MisPropiedadesDeBaja.svelte";
import FrontAdmin from "./paginas/grupos/AdminG.svelte";
import FrontInformes from "./paginas/grupos/InformesG.svelte";
import FrontInquilino from "./paginas/grupos/InquilinoG.svelte";
import FrontPropietario from "./paginas/grupos/PropietarioG.svelte";
import PublicarPropiedad from "./paginas/PublicarPropiedad.svelte";
import BusquedaPropiedades from "./paginas/BusquedaPropiedades.svelte";
import AdminUsuarios from "./paginas/AdminUsuarios.svelte";
import AdminPropiedades from "./paginas/AdminPropiedades.svelte";
import Notificaciones from "./paginas/Notificaciones.svelte";
import ControlAlquileresInquilino from "./paginas/ControlAlquileresInquilino.svelte";
import ControlAlquileresPropietario from "./paginas/ControlAlquileresPropietario.svelte";
import ContratosPropietario from "./paginas/ContratosPropietario.svelte";
import ContratoInquilino from "./paginas/ContratoInquilino.svelte";
import Informes from "./paginas/Informes.svelte";
import CompraYVentas from "./paginas/CompraYVenta.svelte";
import Ventas from "./paginas/Ventas.svelte";
import VerLogs from "./paginas/VerLogs.svelte";
import ControlPagos from "./paginas/ControlPagos.svelte";
import ContratoAdmin from "./paginas/ContratoAdmin.svelte";
import BuscarVentas from "./paginas/BuscarVentas.svelte";
import MisPropiedadesEnVenta from "./paginas/MisPropiedadesEnVenta.svelte";
import AdminGrupos from "./paginas/AdminGrupos.svelte";
</script>
<Router>
<!-- Plantilla path
<!-- Plantilla path
<Route path="">
<ProteRoute componente={}/>
</Route>
-->
<Route path="/" component={Login} />
<Route path="/Info" component={InfoPage} />
<Route path="/" component={Login} />
<Route path="/Info" component={InfoPage} />
<Route path="/Menu">
<ProteRoute componente={MenuPage} />
</Route>
<Route path="/Menu">
<ProteRoute componente={MenuPage} />
</Route>
<!--Publicar Prop
<!--Publicar Prop
iedad-->
<Route path="/accion/1">
<ProteRoute componente={PublicarPropiedad}/>
</Route>
<Route path="/accion/1">
<ProteRoute componente={PublicarPropiedad} />
</Route>
<!--Mis Propiedades-->
<Route path="/accion/2">
<ProteRoute componente={MisPropiedades}/>
</Route>
<!--Mis Propiedades-->
<Route path="/accion/2">
<ProteRoute componente={MisPropiedades} />
</Route>
<!--Buscar Propiedades-->
<Route path="/accion/3">
<ProteRoute componente={BusquedaPropiedades}/>
</Route>
<!--Buscar Propiedades-->
<Route path="/accion/3">
<ProteRoute componente={BusquedaPropiedades} />
</Route>
<!--Crear Cuenta Inquilino-->
<Route path="/accion/4">
<ProteRoute componente={InqPage}/>
</Route>
<!--Crear Cuenta Propietario-->
<Route path="/accion/5">
<ProteRoute componente={PropPage}/>
</Route>
<!--Crear Cuenta Inquilino-->
<Route path="/accion/4">
<ProteRoute componente={InqPage} />
</Route>
<!--Crear Cuenta Propietario-->
<Route path="/accion/6">
<ProteRoute componente={Informes}/>
</Route>
<Route path="/accion/5">
<ProteRoute componente={PropPage} />
</Route>
<!--Ver Logs-->
<Route path="/accion/7">
<ProteRoute componente={VerLogs}/>
</Route>
<!--Crear Cuenta Propietario-->
<Route path="/accion/6">
<ProteRoute componente={Informes} />
</Route>
<!--Administrar Propiedades Dadas de Baja-->
<Route path="/accion/8">
<ProteRoute componente={MisPropiedadesDeBaja}/>
</Route>
<!--Ver Logs-->
<Route path="/accion/7">
<ProteRoute componente={VerLogs} />
</Route>
<!-- Pantalla Control Usuarios -->
<Route path="/accion/9">
<ProteRoute componente={AdminUsuarios}/>
</Route>
<!-- Pantalla Control Propiedades -->
<Route path="/accion/10">
<ProteRoute componente={AdminPropiedades}/>
</Route>
<!-- Pantalla Control Alquileres Inquilino -->
<Route path="/accion/11">
<ProteRoute componente={ControlAlquileresInquilino}/>
</Route>
<!-- Pantalla Control Alquileres Propietario -->
<Route path="/accion/12">
<ProteRoute componente={ControlAlquileresPropietario}/>
</Route>
<!--Administrar Propiedades Dadas de Baja-->
<Route path="/accion/8">
<ProteRoute componente={MisPropiedadesDeBaja} />
</Route>
<!-- Compra y Ventas -->
<Route path="/accion/13">
<ProteRoute componente={CompraYVentas}/>
</Route>
<!-- Pantalla Control Usuarios -->
<Route path="/accion/9">
<ProteRoute componente={AdminUsuarios} />
</Route>
<!-- Control Pago Contratos Incumplidos -->
<Route path="/accion/14">
<ProteRoute componente={ControlPagos}/>
</Route>
<!-- Pantalla Control Propiedades -->
<Route path="/accion/10">
<ProteRoute componente={AdminPropiedades} />
</Route>
<!-- VerPropiedadesEnVenta -->
<Route path="/accion/15">
<ProteRoute componente={MisPropiedadesEnVenta}/>
</Route>
<!-- Buscar Ventas -->
<Route path="/accion/16">
<ProteRoute componente={BuscarVentas}/>
</Route>
<!-- Pantalla Control Alquileres Inquilino -->
<Route path="/accion/11">
<ProteRoute componente={ControlAlquileresInquilino} />
</Route>
<!-- Pagina Ventas -->
<Route path="/Ventas">
<ProteRoute componente={Ventas}/>
</Route>
<!-- Pantalla Control Alquileres Propietario -->
<Route path="/accion/12">
<ProteRoute componente={ControlAlquileresPropietario} />
</Route>
<!--Paginas info Grupo-->
<Route path="/grupo/Inquilino">
<ProteRoute componente={FrontInquilino}/>
</Route>
<Route path="/grupo/Propietario">
<ProteRoute componente={FrontPropietario}/>
</Route>
<Route path="/grupo/Admin">
<ProteRoute componente={FrontAdmin}/>
</Route>
<Route path="/grupo/Informes">
<ProteRoute componente={FrontInformes}/>
</Route>
<!-- Compra y Ventas -->
<Route path="/accion/13">
<ProteRoute componente={CompraYVentas} />
</Route>
<!--Notificaciones-->
<Route path="/notificaciones">
<ProteRoute componente={Notificaciones}/>
</Route>
<!--Contratos Propietarios-->
<Route path="/propietario/contratos">
<ProteRoute componente={ContratosPropietario}/>
</Route>
<!-- Control Pago Contratos Incumplidos -->
<Route path="/accion/14">
<ProteRoute componente={ControlPagos} />
</Route>
<!--Contratos Inquilino-->
<Route path="/inquilino/contratos">
<ProteRoute componente={ContratoInquilino}/>
</Route>
<!-- VerPropiedadesEnVenta -->
<Route path="/accion/15">
<ProteRoute componente={MisPropiedadesEnVenta} />
</Route>
<!--Contratos Admin-->
<Route path="/admin/contratos">
<ProteRoute componente={ContratoAdmin}/>
</Route>
<!-- Buscar Ventas -->
<Route path="/accion/16">
<ProteRoute componente={BuscarVentas} />
</Route>
<!-- Gestion Grupos -->
<Route path="/accion/18">
<ProteRoute componente={AdminGrupos} />
</Route>
<!-- Pagina Ventas -->
<Route path="/Ventas">
<ProteRoute componente={Ventas} />
</Route>
<!--Paginas info Grupo-->
<Route path="/grupo/Inquilino">
<ProteRoute componente={FrontInquilino} />
</Route>
<Route path="/grupo/Propietario">
<ProteRoute componente={FrontPropietario} />
</Route>
<Route path="/grupo/Admin">
<ProteRoute componente={FrontAdmin} />
</Route>
<Route path="/grupo/Informes">
<ProteRoute componente={FrontInformes} />
</Route>
<!--Notificaciones-->
<Route path="/notificaciones">
<ProteRoute componente={Notificaciones} />
</Route>
<!--Contratos Propietarios-->
<Route path="/propietario/contratos">
<ProteRoute componente={ContratosPropietario} />
</Route>
<!--Contratos Inquilino-->
<Route path="/inquilino/contratos">
<ProteRoute componente={ContratoInquilino} />
</Route>
<!--Contratos Admin-->
<Route path="/admin/contratos">
<ProteRoute componente={ContratoAdmin} />
</Route>
</Router>

View File

@@ -87,7 +87,7 @@
}
</script>
<Navbar container="xxl" expand="md" color="dark-subtle">
<Navbar class="border-bottom" container="xxl" expand="md" color="dark-subtle">
<NavbarBrand href="/">AlquilaFacil</NavbarBrand>
<div class="d-flex gap-2">
<div class="badge" style="background-color: turquoise;" use:links>

View File

@@ -1,38 +1,47 @@
<script lang="ts">
import { Navbar, NavbarBrand, NavbarToggler, NavItem, Nav, NavLink, Collapse } from "@sveltestrap/sveltestrap";
let isOpen:boolean =$state(false);
let theme = $state(localStorage.getItem("theme") ?? "light");
const toggleTheme = () => {
theme = theme === "light" ? "dark" : "light";
document.body.setAttribute("data-bs-theme", theme);
localStorage.setItem("theme", theme);
};
import {
Navbar,
NavbarBrand,
NavbarToggler,
NavItem,
Nav,
NavLink,
Collapse,
} from "@sveltestrap/sveltestrap";
let isOpen: boolean = $state(false);
let theme = $state(localStorage.getItem("theme") ?? "light");
const toggleTheme = () => {
theme = theme === "light" ? "dark" : "light";
document.body.setAttribute("data-bs-theme", theme);
localStorage.setItem("theme", theme);
};
</script>
<Navbar container="xxl" expand="md" color="dark-subtle">
<NavbarBrand href="/">
AlquilaFacil
</NavbarBrand>
<div>
<button class="badge btn" onclick={toggleTheme} style="background-color: cadetblue;">
{#if theme === "light" }
<img src="/toggle-left.svg" alt=""/>
{:else}
<img src="/toggle-right.svg" alt=""/>
{/if}
</button>
</div>
<NavbarToggler on:click={() => (isOpen = !isOpen)} />
<Collapse isOpen={isOpen} navbar expand="md">
<Nav class="ms-auto" navbar>
<NavItem>
<NavLink href="/">Login</NavLink>
</NavItem>
<NavItem>
<NavLink href="/Info">Preguntas Frecuentes</NavLink>
</NavItem>
</Nav>
</Collapse>
<Navbar class="border-bottom" container="xxl" expand="md" color="dark-subtle">
<NavbarBrand href="/">AlquilaFacil</NavbarBrand>
<div>
<button
class="badge btn"
onclick={toggleTheme}
style="background-color: cadetblue;"
>
{#if theme === "light"}
<img src="/toggle-left.svg" alt="" />
{:else}
<img src="/toggle-right.svg" alt="" />
{/if}
</button>
</div>
<NavbarToggler on:click={() => (isOpen = !isOpen)} />
<Collapse {isOpen} navbar expand="md">
<Nav class="ms-auto" navbar>
<NavItem>
<NavLink href="/">Login</NavLink>
</NavItem>
<NavItem>
<NavLink href="/Info">Preguntas Frecuentes</NavLink>
</NavItem>
</Nav>
</Collapse>
</Navbar>

View File

@@ -1,6 +1,103 @@
<script>
<script lang="ts">
import { onMount } from "svelte";
import NavBarAutocompletable from "../Componentes/NavBarAutocompletable.svelte";
import type { GrupoDto } from "../types";
import { urlG } from "../stores/urlStore";
const token: string = sessionStorage.getItem("token") || "";
let grupos: GrupoDto[] = $state([]);
let modaldat: string = $state("");
onMount(() => {
ObtenerGrupos();
});
async function ObtenerGrupos() {
try {
const ret = await fetch($urlG + "/api/admin/grupos", {
method: "GET",
headers: {
Auth: token,
},
});
if (!ret.ok) {
modaldat = "Fallo Al intentar hacer la request";
return;
}
grupos = await ret.json();
} catch {
modaldat = "Fallo Al intentar hacer la request";
}
}
</script>
<NavBarAutocompletable />
<div class="container-fluid"></div>
<div class="container-fluid">
{#if grupos.length == 0}
<div class="text-center">
<div class="spinner-border" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
{:else}
{#each grupos as grupo}
<div class="accordion mt-2">
<div class="accordion-item">
<h2 class="accordion-header">
<button
class="accordion-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target={`#${grupo.idgrupo}`}
aria-expanded="false"
aria-controls={grupo.idgrupo}
>
{grupo.nombre}
</button>
</h2>
<div id={grupo.idgrupo} class="accordion-collapse collapse">
<div class="accordion-body">
<div class="row">
<div class="col-6">
<h5>Grupos Incluidos</h5>
<ul class="list-group">
{#if grupo.gruposIncluidos.length == 0}
<li class="list-group-item">
No hay grupos incluidos
</li>
{:else}
{#each grupo.gruposIncluidos as grupoIncluido}
<li class="list-group-item">
{grupoIncluido}
</li>
{/each}
{/if}
</ul>
</div>
<div class="col-6">
<h5>Permisos</h5>
<ul class="list-group">
{#if grupo.permisos.length == 0}
<li class="list-group-item">
No hay grupos incluidos
</li>
{:else}
{#each grupo.permisos as permiso}
<li class="list-group-item">
{permiso.descripcion}
</li>
{/each}
{/if}
</ul>
</div>
</div>
<hr />
<div class="d-flex justify-content-between">
<button class="btn btn-primary">Editar</button>
</div>
</div>
</div>
</div>
</div>
{/each}
{/if}
</div>

View File

@@ -9,25 +9,25 @@
import PaginacionStepper from "../Componentes/PaginacionStepper.svelte";
let Logs: LogDto[] = $state([]);
let pagina:number = $state(1);
let token:string = sessionStorage.getItem("token")||"";
let modaldata:string = $state("");
let showmodal:boolean =$state(false);
let ll:LogDto|any = $state({});
let cantpag:number = $state(0);
let pagina: number = $state(1);
let token: string = sessionStorage.getItem("token") || "";
let modaldata: string = $state("");
let showmodal: boolean = $state(false);
let ll: LogDto | any = $state({});
let cantpag: number = $state(0);
onMount(()=>{
onMount(() => {
obtenerLogs();
obtenerPaginas();
});
async function obtenerPaginas() {
try{
const r = await fetch($urlG+"/api/Logs/cantPag", {
try {
const r = await fetch($urlG + "/api/Logs/cantPag", {
method: "GET",
headers: {
"Auth": token,
}
Auth: token,
},
});
let data = await r.json();
if (r.ok) {
@@ -41,12 +41,12 @@
}
async function obtenerLogs() {
try{
const r = await fetch($urlG+"/api/Logs?pag="+pagina, {
try {
const r = await fetch($urlG + "/api/Logs?pag=" + pagina, {
method: "GET",
headers: {
"Auth": token,
}
Auth: token,
},
});
let data = await r.json();
if (r.ok) {
@@ -63,49 +63,65 @@
ll = l;
showmodal = true;
}
function queryPag(a:number) {
function queryPag(a: number) {
pagina = a;
obtenerLogs();
}
</script>
<NavBarAutocompletable/>
<NavBarAutocompletable />
{#if modaldata}
<ModalEstatico payload={modaldata} close={()=>!!(modaldata = "")}/>
<ModalEstatico payload={modaldata} close={() => !!(modaldata = "")} />
{/if}
{#if showmodal}
<ModalLogs onClose={()=>!!(showmodal=!showmodal)} log={ll}/>
<ModalLogs onClose={() => !!(showmodal = !showmodal)} log={ll} />
{/if}
<div class="container-fluid mt-2">
<BarraHorizontalConTexto text={"Logs"}/>
<table class="table table-responsive table-hover table-striped">
<thead>
<tr>
<th>Fecha</th>
<th>Id Usuario</th>
<th>Accion</th>
<th></th>
</tr>
</thead>
<tbody>
{#each Logs as l}
<tr>
<td>{l.fecha}</td>
<td>{l.dniusuario}</td>
<td>{l.accion}</td>
<td>
<button class="btn btn-primary" onclick={()=>prepararModal(l)}>
Ver
</button>
</td>
</tr>
{/each}
</tbody>
</table>
<div class="d-flex justify-content-center">
<PaginacionStepper currentPag={pagina} {cantpag} {queryPag} centrado={true}/>
<BarraHorizontalConTexto text={"Logs"} />
<div
class="table-container"
style="height: 80vh; overflow-y: auto; margin-bottom: 2.5rem;"
>
<table class="table table-responsive table-hover table-striped">
<thead>
<tr>
<th>Fecha</th>
<th>Id Usuario</th>
<th>Accion</th>
<th></th>
</tr>
</thead>
<tbody>
{#each Logs as l}
<tr>
<td>{l.fecha}</td>
<td>{l.dniusuario}</td>
<td>{l.accion}</td>
<td>
<button
class="btn btn-primary"
onclick={() => prepararModal(l)}
>
Ver
</button>
</td>
</tr>
{/each}
</tbody>
</table>
<div
class="fixed-bottom w-100 d-flex justify-content-center border-top py-2"
style="background-color: rgba(0,0,0,0.5);"
>
<PaginacionStepper
currentPag={pagina}
{cantpag}
{queryPag}
centrado={true}
/>
</div>
</div>
</div>

33
Front/src/types.d.ts vendored
View File

@@ -24,7 +24,7 @@ export type PropiedadVentaDto = {
export type AdminParametrosBusqueda = {
cantidadhabitaciones: number=0,
tipopropiedad: number=0,
tipopropiedad: number=0,
servicios: string="",
pag: number=1
}
@@ -77,7 +77,7 @@ export type MensajeDto = {
mensaje: string,
fecha: Date,
propiedad: string,
}
export type GaranteDto = {
@@ -187,9 +187,9 @@ export type LogDto = {
export type LogDetalleDto = {
fecha:Date,
dniusuario:number,
nombreTabla:string,
columna:string,
valorAnterior:string,
nombreTabla:string,
columna:string,
valorAnterior:string,
valorNuevo:string
}
@@ -208,14 +208,25 @@ export type setVenta = {
}
export type PatchPropiedad = {
id:number,
id:number,
ubicacion:string,
canthabitaciones:number,
piso:number,
letra:string,
email:string,
canthabitaciones:number,
piso:number,
letra:string,
email:string,
tipo:number,
servicios: string[],
monto:number,
iddivisa:number
}
}
export type GrupoDto = {
idgrupo:number,
nombre:string,
gruposIncluidos:string[],
permisos:PermisoDto[]
}
export type PermisoDto = {
id:number,
descripcion:string
}