Creat de către Ciprian
Update Cover

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

---