125 lines
7.7 KiB
HTML
125 lines
7.7 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block title %}{% trans %}Roles y Grupos de Acceso{% endtrans %} - Edu-Space Admin{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="container-fluid pt-5 mt-4">
|
|
<!-- Header -->
|
|
<div class="d-flex justify-content-between align-items-center mb-4 flex-wrap gap-2">
|
|
<div>
|
|
<h1 class="h3 mb-1">
|
|
<i class="bi bi-person-badge text-primary me-2"></i>{% trans %}Roles y Grupos de Acceso{% endtrans %}
|
|
</h1>
|
|
<p class="text-muted small mb-0">{% trans %}Administración de perfiles de usuario y matriz granular de permisos por módulo del sistema.{% endtrans %}</p>
|
|
</div>
|
|
<div>
|
|
<a href="{{ url_for('admin.role_add') }}" class="btn btn-primary">
|
|
<i class="bi bi-plus-circle me-1"></i>{% trans %}Nuevo Rol{% endtrans %}
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Roles Grid / Table -->
|
|
<div class="card border-0 shadow-sm">
|
|
<div class="table-responsive">
|
|
<table class="table table-hover align-middle mb-0">
|
|
<thead class="bg-body-tertiary">
|
|
<tr>
|
|
<th class="ps-4">{% trans %}Nombre del Rol{% endtrans %}</th>
|
|
<th>{% trans %}Descripción{% endtrans %}</th>
|
|
<th>{% trans %}Integrantes{% endtrans %}</th>
|
|
<th>{% trans %}Resumen de Permisos{% endtrans %}</th>
|
|
<th class="text-end pe-4">{% trans %}Acciones{% endtrans %}</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for role in roles %}
|
|
<tr>
|
|
<td class="ps-4">
|
|
<div class="d-flex align-items-center">
|
|
<div class="badge-brand rounded-circle p-2 me-3 d-inline-flex align-items-center justify-content-center" style="width: 38px; height: 38px;">
|
|
<i class="bi bi-shield-check fs-6 text-white"></i>
|
|
</div>
|
|
<div>
|
|
<div class="fw-bold text-primary">{{ role.name }}</div>
|
|
{% if role.is_system %}
|
|
<span class="badge bg-secondary-subtle text-secondary border small">{% trans %}Protegido del Sistema{% endtrans %}</span>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</td>
|
|
<td>
|
|
<span class="text-muted small">{{ role.description or _('Sin descripción provista.') }}</span>
|
|
</td>
|
|
<td>
|
|
<span class="badge bg-primary-subtle text-primary border px-2 py-1">
|
|
<i class="bi bi-people me-1"></i>{{ role.users|length }} {% trans %}usuarios{% endtrans %}
|
|
</span>
|
|
</td>
|
|
<td>
|
|
<div class="d-flex flex-wrap gap-1">
|
|
{% for mod in modules %}
|
|
{% set p_level = role.get_permission(mod.id) %}
|
|
{% if p_level == 'read_write' %}
|
|
<span class="badge bg-success-subtle text-success border small" title="{{ mod.name }}: {% trans %}Lectura y Escritura{% endtrans %}">
|
|
<i class="bi {{ mod.icon }} me-1"></i>{{ mod.name }}: RW
|
|
</span>
|
|
{% elif p_level == 'read' %}
|
|
<span class="badge bg-info-subtle text-info border small" title="{{ mod.name }}: {% trans %}Solo Lectura{% endtrans %}">
|
|
<i class="bi {{ mod.icon }} me-1"></i>{{ mod.name }}: R
|
|
</span>
|
|
{% else %}
|
|
<span class="badge bg-light text-muted border small opacity-75" title="{{ mod.name }}: {% trans %}Sin Acceso{% endtrans %}">
|
|
<i class="bi {{ mod.icon }} me-1"></i>{{ mod.name }}: -
|
|
</span>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</div>
|
|
</td>
|
|
<td class="text-end pe-4">
|
|
<div class="btn-group btn-group-sm">
|
|
<a href="{{ url_for('admin.role_edit', id=role.id) }}" class="btn btn-outline-primary" title="{% trans %}Configurar Permisos{% endtrans %}">
|
|
<i class="bi bi-pencil-square me-1"></i>{% trans %}Permisos{% endtrans %}
|
|
</a>
|
|
{% if not role.is_system %}
|
|
<button type="button" class="btn btn-outline-danger" data-bs-toggle="modal" data-bs-target="#deleteModal{{ role.id }}" title="{% trans %}Eliminar Rol{% endtrans %}" {% if role.users|length > 0 %}disabled{% endif %}>
|
|
<i class="bi bi-trash"></i>
|
|
</button>
|
|
{% endif %}
|
|
</div>
|
|
|
|
{% if not role.is_system %}
|
|
<!-- Delete Confirmation Modal -->
|
|
<div class="modal fade" id="deleteModal{{ role.id }}" tabindex="-1" aria-hidden="true">
|
|
<div class="modal-dialog modal-dialog-centered">
|
|
<div class="modal-content border-0 shadow">
|
|
<div class="modal-header border-0">
|
|
<h5 class="modal-title text-danger">
|
|
<i class="bi bi-exclamation-triangle-fill me-2"></i>{% trans %}Confirmar Eliminación de Rol{% endtrans %}
|
|
</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
</div>
|
|
<div class="modal-body text-start">
|
|
<p>{% trans %}¿Está seguro de que desea eliminar el rol{% endtrans %} <strong>{{ role.name }}</strong>?</p>
|
|
<p class="text-muted small mb-0">{% trans %}Esta acción no se puede deshacer.{% endtrans %}</p>
|
|
</div>
|
|
<div class="modal-footer border-0">
|
|
<button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">{% trans %}Cancelar{% endtrans %}</button>
|
|
<form action="{{ url_for('admin.role_delete', id=role.id) }}" method="POST" class="d-inline">
|
|
<button type="submit" class="btn btn-danger">{% trans %}Eliminar Rol{% endtrans %}</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|