# Role Module

## 1. Pengenalan

Module untuk manage roles menggunakan **Spatie Permission** package. CRUD role dengan permission assignment, guard filter.

## 2. Database

**Table:** `roles` (Spatie default)

| Column | Type | Description |
|--------|------|-------------|
| id | bigint (PK) | Primary key |
| name | string | Role name |
| guard_name | string | Guard (admin/web) |
| timestamps | - | created_at, updated_at |

Unique: `[name, guard_name]`

## 3. Routes

| Method | URI | Permission | Name |
|--------|-----|------------|------|
| GET | `/admin/roles` | `role.view` | `roles.index` |
| GET | `/admin/roles/create` | `role.create` | `roles.create` |
| POST | `/admin/roles` | `role.create` | `roles.store` |
| GET | `/admin/roles/{id}/edit` | `role.update` | `roles.edit` |
| PUT | `/admin/roles/{id}` | `role.update` | `roles.update` |
| DELETE | `/admin/roles/{id}` | `role.delete` | `roles.destroy` |

## 4. Controller — `RoleController`

**Functions:**
- `index()` — List roles, search, pagination.
- `create()` — Return form dengan semua permissions (filtered by guard_name).
- `store(Request)` — Create role + sync permissions.
- `edit($id)` — Return edit form dengan role data + permissions.
- `update(Request, $id)` — Update role + sync permissions.
- `destroy($id)` — Delete role. **`super-admin` role protected — tak boleh delete.**

## 5. Views

- `index.blade.php` — Table: No, Role Name, Guard, Permissions (show first 3 + count badge), Actions (edit/delete). Search, pagination, SweetAlert delete.
- `create.blade.php` — Form: Role Name, Permissions (Select2 multi-select), Guard Name select.
- `edit.blade.php` — Form dengan pre-filled + permission checkboxes using Select2.

## 6. Permissions

| Permission | Description |
|------------|-------------|
| `role.view` | View role list |
| `role.create` | Create role |
| `role.update` | Edit role |
| `role.delete` | Delete role |

**Note:** `super-admin` role protected dari deletion.
