ADMIN - MDT
# vRP_ADM – Descriere tehnică (ADMIN MDT /adm)
Video: https://imgur.com/a/6IINRQB
## 1) Scop
`vrp_adm` este un resource FiveM + vRP care oferă un **Admin MDT (UI NUI)** deschis prin comanda **/adm**.
UI-ul afișează **categorii de rank** (bazate pe `vrp_users.adminLvl`) și o listă de **funcții (cards)**.
Funcțiile se execută prin server, iar unele acțiuni (noclip, teleports) rulează pe client.
---
## 2) Structură fișiere
- **fxmanifest.lua**
- declară UI (`ui_page html/index.html`)
- include fișierele NUI
- încarcă vRP utils pe server: `@vrp/lib/utils.lua`
- pornește `server.lua` și `client.lua`
- **server.lua**
- conectează vRP: `Proxy`, `Tunnel`
- citește rank-ul din DB (`vrp_users.adminLvl`)
- construiește payload-ul pentru UI (rank, categorii, funcții)
- validează permisiuni la fiecare acțiune
- execută acțiunile (kick/ban/db updates/vRP give item etc.)
- trimite rezultate/infos către UI prin evenimente
- **client.lua**
- gestionează deschiderea/închiderea UI + focus
- blochează controalele jocului când UI e deschis (camera nu se mai mișcă)
- primește payload-ul și îl trimite către NUI
- execută funcții locale (noclip, tp waypoint, tp coords etc.)
- trimite la server cereri de execuție din NUI
- **html/index.html**
- layout Admin MDT (stânga: cards funcții, dreapta: categorii, modal popup)
- **html/style.css**
- design (glass/dark)
- fix important: `min-height:0` + `overflow:auto` pentru scroll ca să nu iasă în jos din meniu
- **html/app.js**
- UI logic:
- randare categorii + cards
- filtrare după text (search)
- modal popup pentru acțiuni (ID, motiv, coords, text etc.)
- trimite NUI callbacks către client/server
---
## 3) Baza de date folosită
Tabela: **vrp_users**
Coloane relevante:
- `id` (user_id vRP)
- `username`, `firstName`, `secondName`
- `adminLvl` (rank admin)
- `vipLvl`, `sponsorRank`
- `krCoins`, `walletMoney`, `bankMoney`
- `banned`, `bannedTemp`, `bannedBy`, `bannedReason`
- `m_wanted`, `wanted`, `wanted_by`
- `faction`
**Rank-ul UI** este extras din: `vrp_users.adminLvl`.
---
## 4) Sistem rank / categorii
Scriptul definește o listă de rank-uri (ex):
- R11 Fondator
- R10 CoFondator
- R9 Supporter
- R8 Head of Staff
- R7 Super Administrator
- R6 Administrator
- R5 Super Moderator
- R4 Moderator
- R3 Helper Avansat
- R2 Helper
- R1 Trial Helper
### Reguli:
- **Categorii invizibile** dacă `adminLvl < need`
- La selectarea unei categorii, UI afișează:
- toate funcțiile acelei categorii
- **plus toate funcțiile rank-urilor mai mici** (R1..Rcat), dacă utilizatorul are acces
---
## 5) Flux deschidere UI (/adm)
1. Jucătorul rulează `/adm`
2. `client.lua` → `TriggerServerEvent("vrp_adm:open")`
3. `server.lua`:
- ia `user_id` din vRP
- citește `adminLvl` din DB
- dacă rank <= 0 → deny
- construiește:
- `categories` = doar rank-urile vizibile
- `defaultCategory` = cea mai mică categorie accesibilă (de obicei R1)
- `actions` = funcțiile pentru categoria selectată (cu includere de R1..Rcat)
4. Server trimite `vrp_adm:openUI` către client cu payload
5. Client dă `SetNuiFocus(true,true)` + `SendNUIMessage(setPayload)`
---
## 6) Execuție funcții (cards)
### UI (app.js)
- click pe un card → deschide **Modal Popup**
- modal-ul afișează câmpuri în funcție de tip:
- `none` (nu cere nimic)
- `id` (target ID)
- `id_reason` (target ID + motiv)
- `text` (anunț)
- `coords` (x,y,z)
- `id_days_reason` (ban temp)
- `id_amount` (money/coins)
- `id_level` (vip/sponsor/adminLvl)
- `id_item_amount` (items)
- `id_text` (group add/remove)
La confirm:
- NUI → `runAction(action, params)` → client → server: `vrp_adm:runAction`
### Server (server.lua)
- verifică:
- acțiunea există
- rank-ul utilizatorului >= `need` pentru acea acțiune
- execută acțiunea:
- Kick: `DropPlayer(targetSource, reason)`
- Ban perm/temp: update DB + DropPlayer dacă e online
- Money/Coins: update DB (cu `GREATEST` să nu fie negative)
- Items: vRP `giveInventoryItem` / `tryGetInventoryItem`
- Groups: vRP `addUserGroup` / `removeUserGroup`
- CheckPlayer: query DB și trimite în UI `vrp_adm:showInfo`
### Client (client.lua)
- acțiuni locale:
- `noclip` (toggle + movement)
- `tp waypoint`
- `tp coords`
- `tp to player`
- `bring to` (teleport target la coordonatele tale)
---
## 7) Anti-bug UI / cameră
Când UI este deschis:
- `SetNuiFocus(true,true)`
- Thread în client:
- `DisableAllControlActions(0)`
- permite doar ESC (322)
➡️ **mouse-ul nu mai mișcă camera**, iar input-ul rămâne în UI.
---
## 8) Scroll / layout fix “nu iese în jos”
Pentru că meniul e în flex:
- `.row`, `.left`, `.gridWrap` au `min-height:0`
- `.grid` are `overflow:auto`
➡️ cards-urile se duc în scroll în interior, nu cresc panel-ul în jos.
---
## 9) Extensii recomandate (opțional)
- presets pentru motive Kick/Ban (dropdown)
- log acțiuni în DB (admin_logs)
- confirmare dublă pentru ban permanent
- permisiuni extra: “poți aplica doar pe rank mai mic decât tine”
- audit: cine a dat kick/ban + motiv + timestamp
---