Spaces:
Sleeping
Sleeping
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8" /> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |
| <title>Roles & Users — Vedangsoft Change Detection</title> | |
| <link rel="stylesheet" href="/static/css/style.css?v=35" /> | |
| <link rel="stylesheet" href="/static/css/dda.css?v=48" /> | |
| </head> | |
| <body> | |
| <div class="app dda-app dda-app-full"> | |
| {% include "partials/navbar_dda.html" %} | |
| <div class="dda-main-col"> | |
| {% include "partials/alerts_dda.html" %} | |
| <section id="tab-admin-roles-users" class="dda-panel active" role="tabpanel"> | |
| <div class="dda-hero"> | |
| <h1>Roles & Users</h1> | |
| <p class="sub">Manage role hierarchy, per-module permissions, and user accounts.</p> | |
| </div> | |
| <div class="dda-admin-2col dda-admin-2col-roles"> | |
| <div class="card"> | |
| <div class="card-header"> | |
| <h3>Role Hierarchy</h3> | |
| <button type="button" class="btn btn-primary btn-sm" id="btn-new-role">+ New Role</button> | |
| </div> | |
| <div id="role-list" class="dda-role-list"><p class="dim">Loading roles…</p></div> | |
| </div> | |
| <div class="card"> | |
| <div class="card-header"> | |
| <h3>Users</h3> | |
| <div class="dda-reports-toolbar"> | |
| <input type="search" id="user-filter" class="dda-search" placeholder="Search users…" /> | |
| <button type="button" class="btn btn-primary btn-sm" id="btn-new-user">+ New User</button> | |
| </div> | |
| </div> | |
| <div id="user-table-wrap"><p class="dim">Loading users…</p></div> | |
| <div class="pagination" id="user-pagination"></div> | |
| </div> | |
| </div> | |
| </section> | |
| </div> | |
| </div> | |
| <div id="role-modal" class="dda-modal hidden" role="dialog" aria-modal="true"> | |
| <div class="dda-modal-panel card" style="max-width:480px"> | |
| <div class="card-header"> | |
| <h3 id="role-modal-title">New Role</h3> | |
| <button type="button" class="btn btn-secondary btn-sm" id="role-modal-close">Close</button> | |
| </div> | |
| <form id="role-form"> | |
| <input type="hidden" id="role-id" /> | |
| <div class="form-group"> | |
| <label for="role-name">Name</label> | |
| <input type="text" id="role-name" required /> | |
| </div> | |
| <div class="form-group"> | |
| <label for="role-description">Description</label> | |
| <input type="text" id="role-description" /> | |
| </div> | |
| <div class="form-group"> | |
| <label for="role-rank">Rank (higher = more access)</label> | |
| <input type="number" id="role-rank" min="0" max="99" value="0" /> | |
| </div> | |
| <div class="form-group"> | |
| <label class="dda-check"><input type="checkbox" id="role-active" checked /> Active</label> | |
| </div> | |
| <button type="submit" class="btn btn-primary">Save role</button> | |
| </form> | |
| </div> | |
| </div> | |
| <div id="perm-modal" class="dda-modal hidden" role="dialog" aria-modal="true"> | |
| <div class="dda-modal-panel card" style="max-width:640px"> | |
| <div class="card-header"> | |
| <h3 id="perm-modal-title">Permission Matrix</h3> | |
| <button type="button" class="btn btn-secondary btn-sm" id="perm-modal-close">Close</button> | |
| </div> | |
| <div class="dda-perm-matrix-actions"> | |
| <button type="button" class="btn btn-secondary btn-sm" id="btn-grant-all">Grant All</button> | |
| <button type="button" class="btn btn-secondary btn-sm" id="btn-revoke-all">Revoke All</button> | |
| </div> | |
| <div id="perm-matrix-wrap"><p class="dim">Loading…</p></div> | |
| <button type="button" class="btn btn-primary" id="btn-save-perms" style="margin-top:0.85rem">Save permissions</button> | |
| </div> | |
| </div> | |
| <div id="user-modal" class="dda-modal hidden" role="dialog" aria-modal="true"> | |
| <div class="dda-modal-panel card" style="max-width:480px"> | |
| <div class="card-header"> | |
| <h3 id="user-modal-title">New User</h3> | |
| <button type="button" class="btn btn-secondary btn-sm" id="user-modal-close">Close</button> | |
| </div> | |
| <form id="user-form"> | |
| <input type="hidden" id="user-id" /> | |
| <div class="form-group"> | |
| <label for="user-email">Email</label> | |
| <input type="email" id="user-email" required /> | |
| </div> | |
| <div class="form-group"> | |
| <label for="user-full-name">Full name</label> | |
| <input type="text" id="user-full-name" /> | |
| </div> | |
| <div class="form-group"> | |
| <label for="user-phone">Mobile number</label> | |
| <div class="dda-phone-input"> | |
| <select id="user-country-code" class="dda-country-select" aria-label="Country code"></select> | |
| <input type="tel" id="user-phone" inputmode="numeric" maxlength="15" placeholder="Mobile number" /> | |
| </div> | |
| </div> | |
| <div class="form-group"> | |
| <label for="user-role-select">Role</label> | |
| <select id="user-role-select" required></select> | |
| </div> | |
| <div class="form-group"> | |
| <label for="user-password">Password <span id="user-password-hint" class="dim"></span></label> | |
| <input type="password" id="user-password" minlength="8" /> | |
| </div> | |
| <button type="submit" class="btn btn-primary">Save user</button> | |
| </form> | |
| </div> | |
| </div> | |
| <script src="/static/js/dda/shared.js?v=7"></script> | |
| <script src="/static/js/dda/countries.js?v=1"></script> | |
| <script src="/static/js/dda/app.js?v=29"></script> | |
| <script src="/static/js/dda/notifications.js?v=5"></script> | |
| <script src="/static/js/dda/admin_roles.js?v=5"></script> | |
| </body> | |
| </html> | |