eqeqwan21

users.html

Jul 19th, 2025
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 6.49 KB | None | 0 0
  1. {% extends "apppage.html" %}
  2. {% block content %}
  3. <style>
  4.   .ip-cell {
  5.     max-width: 360px;
  6.   }
  7.  
  8.   .ip-cell .badge {
  9.     font-family: monospace;
  10.   }
  11. </style>
  12. <div class="container my-4 col-lg-10">
  13.  
  14.     {% if resetok %}
  15.     <div class="alert alert-info alert-dismissible fade show">
  16.         {{ "IP addresses cleared"|trans }}
  17.     </div>
  18.     {% endif %}
  19.  
  20.     {% if ok %}
  21.     <div class="alert alert-success alert-dismissible fade show" role="alert">
  22.         {{ "User"|trans }} <strong>{{ ok }}</strong> {{ "created"|trans }}!
  23.     </div>
  24.     {% endif %}
  25.  
  26.     {% if error %}
  27.     <div class="alert alert-danger alert-dismissible fade show" role="alert">
  28.         {{ error }}
  29.     </div>
  30.     {% endif %}
  31.  
  32.     {% if delok %}
  33.     <div class="alert alert-warning alert-dismissible fade show">
  34.         {{ "User deleted"|trans }}
  35.         <button type="button" class="close" data-dismiss="alert">&times;</button>
  36.     </div>
  37.     {% endif %}
  38.  
  39.     {% if devok %}
  40.     <div class="alert alert-info alert-dismissible fade show">
  41.         {{ "Device token cleared"|trans }}
  42.         <button type="button" class="close" data-dismiss="alert">&times;</button>
  43.     </div>
  44.     {% endif %}
  45.  
  46.     {% if lockok %}
  47.     <div class="alert alert-info alert-dismissible fade show">
  48.         {{ "IP slots filled up to 10"|trans }}
  49.         <button type="button" class="close" data-dismiss="alert">&times;</button>
  50.     </div>
  51.     {% endif %}
  52.  
  53.     <div class="d-flex justify-content-between align-items-center mb-2">
  54.         <h3 class="mb-0">{{ "Users"|trans }}</h3>
  55.         <button class="btn btn-primary"
  56.                data-toggle="modal"
  57.                data-target="#newUserModal">
  58.             + {{ "Add user"|trans }}
  59.         </button>
  60.     </div>
  61.  
  62.     <table class="table table-sm table-bordered align-middle">
  63.         <thead class="table-light">
  64.         <tr>
  65.             <th>Login</th>
  66.             <th>Role</th>
  67.             <th class="w-50">Trusted IPs</th>
  68.             <th>Device token</th>
  69.             <th class="text-center" style="width:185px"></th>
  70.         </tr>
  71.         </thead>
  72.         <tbody>
  73.         {% for u in users %}
  74.         <tr>
  75.             <td>{{ u.login }}</td>
  76.             <td>{{ u.role }}</td>
  77.             <td class="ip-cell">
  78.                 {% for ip in u.ip_list|split(', ') %}
  79.                 <span class="badge badge-light mb-1">{{ ip }}</span>
  80.                 {% endfor %}
  81.             </td>
  82.  
  83.             <td>{{ u.dev_token ? "yes" : "-" }}</td>
  84.             <td class="text-nowrap text-center py-1">
  85.                 <div class="d-flex flex-column">
  86.                     <div class="btn-group btn-group-sm mb-1">
  87.                         <form method="post">
  88.                             <input type="hidden" name="uid" value="{{ u.id }}">
  89.                             <input type="hidden" name="action" value="reset_ip">
  90.                             <button class="btn btn-outline-danger btn-sm"
  91.                                    onclick="return confirm('Clear IP for {{ u.login }}?')">
  92.                                 Reset IP
  93.                             </button>
  94.                         </form>
  95.                         <form method="post">
  96.                             <input type="hidden" name="uid" value="{{ u.id }}">
  97.                             <input type="hidden" name="action" value="reset_device">
  98.                             <button class="btn btn-outline-secondary btn-sm"
  99.                                    onclick="return confirm('Reset device token for {{u.login}}?')">
  100.                                 Reset Device
  101.                             </button>
  102.                         </form>
  103.                     </div>
  104.                     <div class="btn-group btn-group-sm mb-1">
  105.                         <form method="post">
  106.                             <input type="hidden" name="uid" value="{{ u.id }}">
  107.                             <input type="hidden" name="action" value="lock_ips">
  108.                             <button class="btn btn-outline-primary btn-sm"
  109.                                    onclick="return confirm('Fill empty IP slots for {{u.login}}?')">
  110.                                 Lock IPs
  111.                             </button>
  112.                         </form>
  113.                         {% if u.id != _SESSION['uid'] %}
  114.                         <form method="post">
  115.                             <input type="hidden" name="uid" value="{{ u.id }}">
  116.                             <input type="hidden" name="action" value="delete_user">
  117.                             <button class="btn btn-outline-secondary btn-sm"
  118.                                    onclick="return confirm('Delete user {{ u.login }}?')">
  119.                                 Delete
  120.                             </button>
  121.                         </form>
  122.                         {% endif %}
  123.                     </div>
  124.                 </div>
  125.             </td>
  126.         </tr>
  127.         {% endfor %}
  128.         </tbody>
  129.     </table>
  130. </div>
  131.  
  132. <div class="modal fade" id="newUserModal" tabindex="-1">
  133.     <div class="modal-dialog">
  134.         <form method="post" class="modal-content">
  135.             <div class="modal-header">
  136.                 <h5 class="modal-title">{{ "Add new user"|trans }}</h5>
  137.                 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  138.                     <span aria-hidden="true">&times;</span>
  139.                 </button>
  140.             </div>
  141.             <div class="modal-body">
  142.                 {% if error %}
  143.                 <div class="alert alert-danger py-1">{{ error }}</div>
  144.                 {% endif %}
  145.                 <div class="mb-2">
  146.                     <label class="form-label">{{ "Login"|trans }}</label>
  147.                     <input name="login" class="form-control" required>
  148.                 </div>
  149.                 <div class="mb-2">
  150.                     <label class="form-label">{{ "Password"|trans }}</label>
  151.                     <input name="pass" type="password" class="form-control" required>
  152.                 </div>
  153.                 <div class="mb-0">
  154.                     <label class="form-label">{{ "Role"|trans }}</label>
  155.                     <select name="role" class="form-control">
  156.                         <option value="user">user</option>
  157.                         <option value="admin">admin</option>
  158.                     </select>
  159.                 </div>
  160.             </div>
  161.             <div class="modal-footer">
  162.                 <button class="btn btn-primary">{{ "Create"|trans }}</button>
  163.             </div>
  164.         </form>
  165.     </div>
  166. </div>
  167.  
  168. {% endblock %}
Add Comment
Please, Sign In to add comment