Files

249 lines
13 KiB
HTML

{% extends "base.html" %}
{% block title %}Gestión de Edificios - Edu-Space Admin{% endblock %}
{% block content %}
<div class="container-fluid pt-5 mt-4">
<!-- Header -->
<div class="row mb-4 align-items-center">
<div class="col-md-7">
<h1 class="h3 mb-1">
<i class="bi bi-buildings text-primary me-2"></i>Gestión de Edificios
</h1>
<p class="text-muted small mb-0">Administra las sedes, edificios físicos y campus virtuales de UniCABA</p>
</div>
<div class="col-md-5 text-md-end mt-3 mt-md-0">
{% if user.has_permission('classrooms', 'read_write') %}
<a href="/buildings/add_building" class="btn btn-primary me-2">
<i class="bi bi-plus-circle me-1"></i>Nuevo Edificio
</a>
{% endif %}
<a href="/classrooms/list_classrooms" class="btn btn-outline-secondary">
<i class="bi bi-door-open me-1"></i>Ver Aulas
</a>
</div>
</div>
<!-- Alertas de estado -->
{% if success or updated or created %}
<div class="alert alert-success alert-dismissible fade show border-0 shadow-sm mb-4" role="alert">
<i class="bi bi-check-circle-fill me-2"></i>
{% if created %}El edificio ha sido creado exitosamente.{% else %}Los datos del edificio se actualizaron correctamente.{% endif %}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
{% endif %}
<!-- Statistics Cards -->
<div class="row g-3 mb-4">
<div class="col-sm-6 col-xl-3">
<div class="card border-0 shadow-sm h-100">
<div class="card-body p-3">
<div class="d-flex align-items-center">
<div class="rounded-3 p-3 bg-primary bg-opacity-10 text-primary me-3">
<i class="bi bi-buildings fs-3"></i>
</div>
<div>
<div class="text-muted small fw-semibold">Sedes y Edificios</div>
<h3 class="fw-bold mb-0">{{ buildings|length }}</h3>
<small class="text-muted" style="font-size: 0.72rem;">Físicas y Digitales</small>
</div>
</div>
</div>
</div>
</div>
<div class="col-sm-6 col-xl-3">
<div class="card border-0 shadow-sm h-100">
<div class="card-body p-3">
<div class="d-flex align-items-center">
<div class="rounded-3 p-3 bg-success bg-opacity-10 text-success me-3">
<i class="bi bi-door-open fs-3"></i>
</div>
<div>
<div class="text-muted small fw-semibold">Aulas Totales</div>
<h3 class="fw-bold mb-0 text-success">{{ total_classrooms }}</h3>
<small class="text-muted" style="font-size: 0.72rem;">Activas en el sistema</small>
</div>
</div>
</div>
</div>
</div>
<div class="col-sm-6 col-xl-3">
<div class="card border-0 shadow-sm h-100">
<div class="card-body p-3">
<div class="d-flex align-items-center">
<div class="rounded-3 p-3 bg-info bg-opacity-10 text-info me-3">
<i class="bi bi-people fs-3"></i>
</div>
<div>
<div class="text-muted small fw-semibold">Capacidad Física Instalada</div>
<h3 class="fw-bold mb-0 text-info">{{ total_physical_capacity or total_capacity }}</h3>
<small class="text-info fw-semibold" style="font-size: 0.72rem;">
<i class="bi bi-cloud-check me-1"></i>+ Campus Virtual (Ilimitado)
</small>
</div>
</div>
</div>
</div>
</div>
<div class="col-sm-6 col-xl-3">
<div class="card border-0 shadow-sm h-100">
<div class="card-body p-3">
<div class="d-flex align-items-center">
<div class="rounded-3 p-3 bg-warning bg-opacity-10 text-warning me-3">
<i class="bi bi-layers fs-3"></i>
</div>
<div>
<div class="text-muted small fw-semibold">Pisos Presenciales</div>
<h3 class="fw-bold mb-0 text-warning">{{ buildings|sum(attribute='floors') }}</h3>
<small class="text-muted" style="font-size: 0.72rem;">Plantas físicas activas</small>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Filter & Search Toolbar -->
<div class="card border-0 shadow-sm mb-4">
<div class="card-body p-3">
<form method="GET" class="row g-2 align-items-center">
<div class="col-md-6">
<div class="input-group">
<span class="input-group-text bg-body-tertiary border-end-0">
<i class="bi bi-search text-muted"></i>
</span>
<input type="text" name="search" value="{{ search }}" class="form-control border-start-0" placeholder="Buscar por nombre, código o dirección...">
</div>
</div>
<div class="col-md-4">
<select name="status" class="form-select" onchange="this.form.submit()">
<option value="">Todos los estados</option>
<option value="active" {% if status_filter == 'active' %}selected{% endif %}>Activos únicamente</option>
<option value="inactive" {% if status_filter == 'inactive' %}selected{% endif %}>Inactivos</option>
</select>
</div>
<div class="col-md-2 d-flex gap-2">
<button type="submit" class="btn btn-primary w-100">Buscar</button>
{% if search or status_filter %}
<a href="/buildings/list_buildings" class="btn btn-outline-secondary" title="Limpiar filtro">
<i class="bi bi-x-lg"></i>
</a>
{% endif %}
</div>
</form>
</div>
</div>
<!-- Buildings Cards List -->
<div class="row g-3">
{% for b in buildings %}
<div class="col-lg-6">
<div class="card border-0 shadow-sm h-100 position-relative {% if b.is_virtual %}border-start border-4 border-info{% endif %}">
<div class="card-header bg-body-tertiary border-0 py-3 d-flex justify-content-between align-items-center">
<div>
<span class="badge {% if b.is_virtual %}bg-info-subtle text-info border border-info-subtle{% else %}bg-secondary-subtle text-secondary border{% endif %} font-monospace mb-1">
{% if b.is_virtual %}<i class="bi bi-cloud-fill me-1"></i>{% endif %}{{ b.code or 'EDIF' }}
</span>
<h5 class="card-title fw-bold mb-0">
<a href="/buildings/view/{{ b.id }}" class="text-decoration-none text-primary">
{{ b.name }}
</a>
</h5>
</div>
<div>
{% if b.is_active %}
<span class="badge bg-success-subtle text-success border border-success-subtle px-2 py-1">
<i class="bi bi-check-circle me-1"></i>Activo
</span>
{% else %}
<span class="badge bg-danger-subtle text-danger border border-danger-subtle px-2 py-1">
<i class="bi bi-x-circle me-1"></i>Inactivo
</span>
{% endif %}
</div>
</div>
<div class="card-body">
{% if b.address %}
<p class="text-muted small mb-3">
<i class="bi {% if b.is_virtual %}bi-globe2 text-info{% else %}bi-geo-alt-fill text-danger{% endif %} me-1"></i>{{ b.address }}
</p>
{% endif %}
{% if b.description %}
<p class="small text-secondary mb-3">{{ b.description }}</p>
{% endif %}
<div class="row g-2 text-center pt-2 border-top">
<div class="col-4">
<div class="p-2 rounded bg-body-tertiary">
<small class="text-muted d-block">Pisos</small>
{% if b.is_virtual %}
<span class="badge bg-info-subtle text-info border border-info-subtle mt-1">Digital</span>
{% else %}
<span class="fw-bold fs-6">{{ b.floors }}</span>
{% endif %}
</div>
</div>
<div class="col-4">
<div class="p-2 rounded bg-body-tertiary">
<small class="text-muted d-block">Aulas</small>
<span class="fw-bold fs-6 text-primary">{{ b.classrooms_count }}</span>
</div>
</div>
<div class="col-4">
<div class="p-2 rounded bg-body-tertiary">
<small class="text-muted d-block">Capacidad</small>
{% if b.is_virtual %}
<span class="badge bg-primary-subtle text-primary border border-primary-subtle mt-1" title="Capacidad de concurrencia virtual ilimitada">
<i class="bi bi-infinity me-1"></i>Ilimitada
</span>
{% else %}
<span class="fw-bold fs-6 text-success">{{ b.physical_capacity or b.total_capacity }}</span>
{% endif %}
</div>
</div>
</div>
</div>
<div class="card-footer bg-transparent border-0 py-3 d-flex justify-content-between align-items-center">
<a href="/buildings/view/{{ b.id }}" class="btn btn-outline-primary btn-sm">
<i class="bi bi-eye me-1"></i>Ver Aulas
</a>
{% if user.has_permission('classrooms', 'read_write') or user.is_admin() or user.is_bedelia() %}
<div class="btn-group">
<a href="/buildings/edit/{{ b.id }}" class="btn btn-outline-secondary btn-sm" title="Editar Edificio">
<i class="bi bi-pencil me-1"></i>Editar
</a>
<form method="POST" action="/buildings/toggle/{{ b.id }}" class="d-inline">
<button type="submit" class="btn btn-outline-secondary btn-sm" title="{% if b.is_active %}Desactivar{% else %}Activar{% endif %}">
<i class="bi bi-power"></i>
</button>
</form>
</div>
{% endif %}
</div>
</div>
</div>
{% else %}
<div class="col-12">
<div class="card border-0 shadow-sm p-5 text-center">
<i class="bi bi-buildings text-muted fs-1 mb-3"></i>
<h5 class="fw-bold">No se encontraron edificios</h5>
<p class="text-muted mb-3">No hay edificios que coincidan con los criterios de búsqueda.</p>
{% if user.has_permission('classrooms', 'read_write') %}
<div>
<a href="/buildings/add_building" class="btn btn-primary">
<i class="bi bi-plus-circle me-1"></i>Crear Nuevo Edificio
</a>
</div>
{% endif %}
</div>
</div>
{% endfor %}
</div>
</div>
{% endblock %}