feat: user management and role
This commit is contained in:
parent
61f3f862c5
commit
4d3eedf3c0
@ -114,3 +114,17 @@ function idn_date($tanggal, $format = 'd F Y')
|
|||||||
return Carbon::parse($tanggal)->locale('id')->translatedFormat($format);
|
return Carbon::parse($tanggal)->locale('id')->translatedFormat($format);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!function_exists('get_user_status')) {
|
||||||
|
function get_user_status($status)
|
||||||
|
{
|
||||||
|
switch($status){
|
||||||
|
case '0':
|
||||||
|
return 'Menunggu';
|
||||||
|
case '1':
|
||||||
|
return 'Aktif';
|
||||||
|
case '2':
|
||||||
|
return 'Nonaktif';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -8,7 +8,9 @@
|
|||||||
use App\Models\ContentRecap;
|
use App\Models\ContentRecap;
|
||||||
use App\Models\GovernmentAgency;
|
use App\Models\GovernmentAgency;
|
||||||
use App\Models\News;
|
use App\Models\News;
|
||||||
|
use App\Models\Role;
|
||||||
use App\Models\SubClassification;
|
use App\Models\SubClassification;
|
||||||
|
use App\Models\User;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
use SebastianBergmann\Type\TrueType;
|
use SebastianBergmann\Type\TrueType;
|
||||||
@ -348,4 +350,116 @@ public function contentRecap(Request $request){
|
|||||||
return response()->json(['error' => 'Unauthorized'], 401);
|
return response()->json(['error' => 'Unauthorized'], 401);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function user(Request $request){
|
||||||
|
if ($request->ajax()) {
|
||||||
|
|
||||||
|
$roleParam = $request->input('role', null);
|
||||||
|
|
||||||
|
if($roleParam){
|
||||||
|
$role = Role::findOrFail(decrypt_id($roleParam));
|
||||||
|
$data = User::with(['role'])->where('role_id', '=', $role->id)->get();
|
||||||
|
}else{
|
||||||
|
$data = User::with(['role'])->get();
|
||||||
|
}
|
||||||
|
|
||||||
|
return DataTables::of($data)
|
||||||
|
->addIndexColumn()
|
||||||
|
->addColumn('role', function ($data){
|
||||||
|
return $data->role->name;
|
||||||
|
})
|
||||||
|
->addColumn('status', function ($data){
|
||||||
|
switch($data->status){
|
||||||
|
case '0':
|
||||||
|
return '<span class="badge bg-warning" style="display:inline-block;font-size:0.8rem;">Menunggu</span>';
|
||||||
|
case '1':
|
||||||
|
return '<span class="badge bg-primary" style="display:inline-block;font-size:0.8rem;">Aktif</span>';
|
||||||
|
case '2':
|
||||||
|
return '<span class="badge bg-danger" style="display:inline-block;font-size:0.8rem;">Nonaktif</span>';
|
||||||
|
case '3':
|
||||||
|
return '<span class="badge bg-danger" style="display:inline-block;font-size:0.8rem;">Ditolak</span>';
|
||||||
|
default:
|
||||||
|
return '<span class="badge bg-secondary" style="display:inline-block;font-size:0.8rem;">Tidak Diketahui</span>';
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
->addColumn('action', function ($data) {
|
||||||
|
$showUrl = route('dashboard.users.show', ['id' => encrypt_id($data->id)]);
|
||||||
|
|
||||||
|
$acceptUrl = route('dashboard.users.status.action', ['id' => encrypt_id($data->id), 'action' => 'accept']);
|
||||||
|
|
||||||
|
$rejectUrl = route('dashboard.users.status.action', ['id' => encrypt_id($data->id), 'action' => 'reject']);
|
||||||
|
|
||||||
|
$resetPasswordUrl = route('dashboard.users.reset.password', ['id' => encrypt_id($data->id)]);
|
||||||
|
|
||||||
|
$editUrl = route('dashboard.users.edit', ['id' => encrypt_id($data->id)]);
|
||||||
|
|
||||||
|
$deleteUrl = route('dashboard.users.destroy', ['id' => encrypt_id($data->id)]);
|
||||||
|
|
||||||
|
$dropdown = '<div class="dropdown" style="display:flex; justify-content:center;">
|
||||||
|
<a class="dropdown-toggle btn btn-icon btn-light" data-bs-toggle="dropdown"><em class="icon ni ni-more-v"></em></a>
|
||||||
|
<div class="dropdown-menu dropdown-menu-end">
|
||||||
|
<ul class="link-list-opt">
|
||||||
|
<li><a href="'.$showUrl.'"><em class="icon ni ni-eye"></em><span>Detail</span></a></li>';
|
||||||
|
|
||||||
|
if (is_role([1]) && $data->status === '0') {
|
||||||
|
$dropdown .= '<li><a href="javascript:void(0);" onclick="statusAction(\''.$acceptUrl.'\', \'Apakah Anda yakin ingin menyetujui pengguna '.$data->name.'?\', \'Ya, Setujui\')"><em class="icon ni ni-check"></em><span>Setujui</span></a></li>';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_role([1]) && $data->status === '0') {
|
||||||
|
$dropdown .= '<li><a href="javascript:void(0);" onclick="statusAction(\''.$rejectUrl.'\', \'Apakah Anda yakin ingin menolak pengguna '.$data->name.'?\', \'Ya, Tolak\')"><em class="icon ni ni-cross"></em><span>Tolak</span></a></li>';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_role([1])) {
|
||||||
|
$dropdown .= '<li><a href="'.$resetPasswordUrl.'"><em class="icon ni ni-lock"></em><span>Reset Password</span></a></li>';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_role([1])) {
|
||||||
|
$dropdown .= '<li><a href="'.$editUrl.'"><em class="icon ni ni-edit"></em><span>Ubah</span></a></li>';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_role([1])) {
|
||||||
|
$dropdown .= '<li><a href="javascript:void(0);" onclick="deleteItem(\''.$deleteUrl.'\', \'Apakah Anda yakin ingin menghapus pengguna '.$data->name.'? Akun pengguna dan data yang berhubungan dengannya juga akan dihapus secara permanen!\')"><em class="icon ni ni-trash"></em><span>Hapus</span></a></li>';
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$dropdown .= '</ul>
|
||||||
|
</div>
|
||||||
|
</div>';
|
||||||
|
|
||||||
|
return $dropdown;
|
||||||
|
})
|
||||||
|
|
||||||
|
->rawColumns(['status', 'action'])
|
||||||
|
->make(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json(['error' => 'Unauthorized'], 401);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function role(Request $request){
|
||||||
|
if ($request->ajax()) {
|
||||||
|
|
||||||
|
$data = Role::with(['user'])->get();
|
||||||
|
|
||||||
|
return DataTables::of($data)
|
||||||
|
->addIndexColumn()
|
||||||
|
->addColumn('account_count', function ($data) {
|
||||||
|
$accountCount = $data->user->count();
|
||||||
|
|
||||||
|
if($accountCount > 0){
|
||||||
|
return $accountCount. ' [<a href="'.route('dashboard.users.index', ['role' => encrypt_id($data->id)]).'">Lihat</a>]';
|
||||||
|
}else{
|
||||||
|
return $accountCount;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
->rawColumns(['account_count'])
|
||||||
|
->make(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json(['error' => 'Unauthorized'], 401);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
15
app/Http/Controllers/Dashboard/RoleController.php
Normal file
15
app/Http/Controllers/Dashboard/RoleController.php
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Dashboard;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class RoleController extends Controller
|
||||||
|
{
|
||||||
|
public function index(){
|
||||||
|
return view('dashboard.role.index', [
|
||||||
|
'title' => 'Role Pengguna'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
160
app/Http/Controllers/Dashboard/UserController.php
Normal file
160
app/Http/Controllers/Dashboard/UserController.php
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Dashboard;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Http\Requests\ResetPasswordRequest;
|
||||||
|
use App\Http\Requests\UserRequest;
|
||||||
|
use App\Models\Role;
|
||||||
|
use App\Models\User;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class UserController extends Controller
|
||||||
|
{
|
||||||
|
public function index(Request $request){
|
||||||
|
return view('dashboard.users.index', [
|
||||||
|
'title' => 'Pengguna',
|
||||||
|
'role' => $request->input('role', null)
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function create(){
|
||||||
|
return view('dashboard.users.create', [
|
||||||
|
'title' => 'Tambah Pengguna',
|
||||||
|
'roles' => Role::all()
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function store(UserRequest $request){
|
||||||
|
$validatedData = $request->validated();
|
||||||
|
|
||||||
|
$createdUser = User::create($validatedData);
|
||||||
|
|
||||||
|
if($createdUser){
|
||||||
|
return redirect()->back()->with('success-status', 'Berhasil menambahkan pengguna.');
|
||||||
|
}else{
|
||||||
|
return redirect()->back()->with('failed-status', 'Gagal menambahkan pengguna.');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function edit($id){
|
||||||
|
$user = User::with(['role'])->findOrFail(decrypt_id($id));
|
||||||
|
|
||||||
|
return view('dashboard.users.edit', [
|
||||||
|
'title' => 'Ubah Pengguna',
|
||||||
|
'user' => $user,
|
||||||
|
'roles' => Role::all()
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function update(UserRequest $request, $id){
|
||||||
|
$validatedData = $request->validated();
|
||||||
|
|
||||||
|
if (isset($validatedData['password']) && !empty($validatedData['password'])) {
|
||||||
|
$validatedData['password'] = $request->input('password');
|
||||||
|
} else {
|
||||||
|
unset($validatedData['password']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = User::findOrFail(decrypt_id($id));
|
||||||
|
$updatedUser = $user->update($validatedData);
|
||||||
|
|
||||||
|
if($updatedUser){
|
||||||
|
return redirect()->back()->with('success-status', 'Berhasil mengubah pengguna.');
|
||||||
|
}else{
|
||||||
|
return redirect()->back()->with('failed-status', 'Gagal mengubah pengguna.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function show($id){
|
||||||
|
$user = User::with(['role', 'company.media.journalists'])->findOrFail(decrypt_id($id));
|
||||||
|
|
||||||
|
$viewData = [
|
||||||
|
'title' => 'Detail Pengguna',
|
||||||
|
'user' => $user,
|
||||||
|
'roles' => Role::all()
|
||||||
|
];
|
||||||
|
|
||||||
|
if($user->role_id === '3'){
|
||||||
|
$viewData['company'] = $user->company;
|
||||||
|
$viewData['media'] = $user->company->media;
|
||||||
|
$viewData['journalists'] = $user->company->media->journalists;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return view('dashboard.users.show', $viewData);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function resetPassword($id){
|
||||||
|
$user = User::with(['role'])->findOrFail(decrypt_id($id));
|
||||||
|
|
||||||
|
return view('dashboard.users.reset-password',[
|
||||||
|
'title' => 'Reset Password',
|
||||||
|
'user' => $user
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function resetPasswordAction(ResetPasswordRequest $request, $id){
|
||||||
|
$validatedData = $request->validated();
|
||||||
|
|
||||||
|
$updatedUser = User::findOrFail(decrypt_id($id))->update([
|
||||||
|
'password' => $validatedData['password']
|
||||||
|
]);
|
||||||
|
|
||||||
|
if($updatedUser){
|
||||||
|
return redirect()->back()->with('success-status', 'Berhasil mereset password pengguna.');
|
||||||
|
}else{
|
||||||
|
return redirect()->back()->with('failed-status', 'Gagal mereset password pengguna.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function statusAction($id, $action){
|
||||||
|
$user = User::findOrFail(decrypt_id($id));
|
||||||
|
|
||||||
|
if($user->status === '0'){
|
||||||
|
if($action == 'accept'){
|
||||||
|
$user->update([
|
||||||
|
'status' => '1'
|
||||||
|
]);
|
||||||
|
}else if($action == 'reject'){
|
||||||
|
$user->update([
|
||||||
|
'status' => '3'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function destroy($id)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$user = User::with(['company.media.journalists'])->findOrFail(decrypt_id($id));
|
||||||
|
|
||||||
|
if ($user->role_id == '3') {
|
||||||
|
if ($user->company) {
|
||||||
|
$company = $user->company;
|
||||||
|
|
||||||
|
if ($company->media) {
|
||||||
|
$media = $company->media;
|
||||||
|
|
||||||
|
if ($media->journalists) {
|
||||||
|
$media->journalists->delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
$media->delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
$company->delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$user->delete();
|
||||||
|
|
||||||
|
return response()->json(['message' => 'Berhasil menghapus user beserta data terkait.']);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
return response()->json(['message' => 'Gagal menghapus user atau data terkait.'], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
58
app/Http/Requests/ResetPasswordRequest.php
Normal file
58
app/Http/Requests/ResetPasswordRequest.php
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use App\Rules\MatchCurrentPasswordRule;
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
use Illuminate\Validation\Rules\Password;
|
||||||
|
|
||||||
|
class ResetPasswordRequest extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return Auth::check() && is_role(['1']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'password' => ['required', 'confirmed', Password::min(8)
|
||||||
|
->mixedCase()
|
||||||
|
->numbers()
|
||||||
|
->symbols()],
|
||||||
|
'my_password' => ['required', Password::min(8)
|
||||||
|
->mixedCase()
|
||||||
|
->numbers()
|
||||||
|
->symbols(), new MatchCurrentPasswordRule()],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function messages()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'password.required' => 'Password baru wajib diisi.',
|
||||||
|
'password.confirmed' => 'Konfirmasi password baru tidak cocok.',
|
||||||
|
'password.min' => 'Password baru harus memiliki minimal 8 karakter.',
|
||||||
|
'password.mixedCase' => 'Password baru harus mengandung huruf besar dan huruf kecil.',
|
||||||
|
'password.numbers' => 'Password baru harus mengandung angka.',
|
||||||
|
'password.symbols' => 'Password baru harus mengandung simbol.',
|
||||||
|
|
||||||
|
'my_password.required' => 'Password Anda wajib diisi.',
|
||||||
|
'my_password.confirmed' => 'Konfirmasi password Anda tidak cocok.',
|
||||||
|
'my_password.min' => 'Password Anda harus memiliki minimal 8 karakter.',
|
||||||
|
'my_password.mixedCase' => 'Password Anda harus mengandung huruf besar dan huruf kecil.',
|
||||||
|
'my_password.numbers' => 'Password Anda harus mengandung angka.',
|
||||||
|
'my_password.symbols' => 'Password Anda harus mengandung simbol.',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
69
app/Http/Requests/UserRequest.php
Normal file
69
app/Http/Requests/UserRequest.php
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use App\Rules\MatchCurrentPasswordRule;
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
use Illuminate\Validation\Rules\Password;
|
||||||
|
|
||||||
|
class UserRequest extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return Auth::check() && is_role(['1']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
$rules = [
|
||||||
|
'name' => ['required', 'max:100'],
|
||||||
|
'email' => ['required', 'email', 'max:100'],
|
||||||
|
'role_id' => ['required', 'in:1,2,3,4'],
|
||||||
|
'status' => ['required', 'in:1,2'],
|
||||||
|
];
|
||||||
|
|
||||||
|
if($this->isMethod('post')){
|
||||||
|
$rules['password'] = ['required', 'confirmed', Password::min(8)
|
||||||
|
->mixedCase()
|
||||||
|
->numbers()
|
||||||
|
->symbols()];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $rules;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function messages()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'name.required' => 'Nama wajib diisi.',
|
||||||
|
'name.max' => 'Nama tidak boleh lebih dari 100 karakter.',
|
||||||
|
|
||||||
|
'email.required' => 'Email wajib diisi.',
|
||||||
|
'email.email' => 'Email harus menggunakan format email yang valid.',
|
||||||
|
'email.max' => 'Email tidak boleh lebih dari 100 karakter.',
|
||||||
|
|
||||||
|
'role_id.required' => 'Role wajib dipilih.',
|
||||||
|
'role_id.in' => 'Role harus salah satu dari: Admin, Admin Monitoring, atau Admin Konten.',
|
||||||
|
|
||||||
|
'status.required' => 'Status wajib dipilih.',
|
||||||
|
'status.in' => 'Status harus salah satu dari: Aktif, atau Nonaktif.',
|
||||||
|
|
||||||
|
'password.required' => 'Password wajib diisi.',
|
||||||
|
'password.confirmed' => 'Password dan konfirmasi password tidak cocok.',
|
||||||
|
'password.min' => 'Password harus memiliki minimal 8 karakter.',
|
||||||
|
'password.mixedCase' => 'Password harus mengandung huruf besar dan huruf kecil.',
|
||||||
|
'password.numbers' => 'Password harus mengandung angka.',
|
||||||
|
'password.symbols' => 'Password harus mengandung simbol.',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -33,4 +33,12 @@ class Company extends Model
|
|||||||
'cooperation_request_doc',
|
'cooperation_request_doc',
|
||||||
'user_id'
|
'user_id'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public function user(){
|
||||||
|
return $this->belongsTo(User::class, 'user_id', 'id');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function media(){
|
||||||
|
return $this->hasOne(Media::class, 'company_id', 'id');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,4 +18,8 @@ class Journalist extends Model
|
|||||||
'ukw_sertificate_doc',
|
'ukw_sertificate_doc',
|
||||||
'media_id',
|
'media_id',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public function media(){
|
||||||
|
return $this->belongsTo(Media::class, 'media_id', 'id');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,4 +20,12 @@ class Media extends Model
|
|||||||
'press_council_certificate_doc',
|
'press_council_certificate_doc',
|
||||||
'company_id',
|
'company_id',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public function company(){
|
||||||
|
return $this->belongsTo(Company::class, 'company_id', 'id');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function journalists(){
|
||||||
|
return $this->hasMany(Journalist::class, 'media_id', 'id');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,4 +12,8 @@ class Role extends Model
|
|||||||
'name',
|
'name',
|
||||||
'description'
|
'description'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public function user(){
|
||||||
|
return $this->hasMany(User::class, 'role_id', 'id');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
// use Illuminate\Contracts\Auth\MustVerifyEmail;
|
// use Illuminate\Contracts\Auth\MustVerifyEmail;
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
use Illuminate\Foundation\Auth\User as Authenticatable;
|
use Illuminate\Foundation\Auth\User as Authenticatable;
|
||||||
use Illuminate\Notifications\Notifiable;
|
use Illuminate\Notifications\Notifiable;
|
||||||
|
|
||||||
@ -51,4 +53,8 @@ protected function casts(): array
|
|||||||
public function role(){
|
public function role(){
|
||||||
return $this->belongsTo(Role::class, 'role_id', 'id');
|
return $this->belongsTo(Role::class, 'role_id', 'id');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function company(){
|
||||||
|
return $this->hasOne(Company::class, 'user_id', 'id');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
25
app/Rules/MatchCurrentPasswordRule.php
Normal file
25
app/Rules/MatchCurrentPasswordRule.php
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Rules;
|
||||||
|
|
||||||
|
use App\Models\User;
|
||||||
|
use Closure;
|
||||||
|
use Illuminate\Contracts\Validation\ValidationRule;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
use Illuminate\Support\Facades\Hash;
|
||||||
|
|
||||||
|
class MatchCurrentPasswordRule implements ValidationRule
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the validation rule.
|
||||||
|
*
|
||||||
|
* @param \Closure(string, ?string=): \Illuminate\Translation\PotentiallyTranslatedString $fail
|
||||||
|
*/
|
||||||
|
public function validate(string $attribute, mixed $value, Closure $fail): void
|
||||||
|
{
|
||||||
|
$user = User::find(Auth::id());
|
||||||
|
if (!Hash::check($value, $user->password)) {
|
||||||
|
$fail('Kata sandi saat ini tidak sesuai.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -17,7 +17,7 @@ public function up(): void
|
|||||||
$table->string('email')->unique();
|
$table->string('email')->unique();
|
||||||
$table->timestamp('email_verified_at')->nullable();
|
$table->timestamp('email_verified_at')->nullable();
|
||||||
$table->string('password');
|
$table->string('password');
|
||||||
$table->enum('status', ['0', '1', '2'])->default('0');
|
$table->enum('status', ['0', '1', '2', '3'])->default('0');
|
||||||
$table->unsignedBigInteger('role_id');
|
$table->unsignedBigInteger('role_id');
|
||||||
$table->foreign('role_id')->references('id')->on('user_roles');
|
$table->foreign('role_id')->references('id')->on('user_roles');
|
||||||
$table->rememberToken();
|
$table->rememberToken();
|
||||||
|
|||||||
61
resources/views/dashboard/role/index.blade.php
Normal file
61
resources/views/dashboard/role/index.blade.php
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
@include('partials.dashboard.head')
|
||||||
|
@include('partials.dashboard.sidebar', ['page' => 'roles'])
|
||||||
|
@include('partials.dashboard.header')
|
||||||
|
<!-- content @s -->
|
||||||
|
<div class="nk-content ">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="nk-content-inner">
|
||||||
|
<div class="nk-content-body">
|
||||||
|
<div class="nk-block-head nk-block-head-sm">
|
||||||
|
<div class="nk-block-between">
|
||||||
|
<div class="nk-block-head-content">
|
||||||
|
<h3 class="nk-block-title page-title">{{$title}}</h3>
|
||||||
|
</div><!-- .nk-block-head-content -->
|
||||||
|
{{-- <div class="nk-block-head-content">
|
||||||
|
<div class="toggle-wrap nk-block-tools-toggle">
|
||||||
|
<a href="#" class="btn btn-icon btn-trigger toggle-expand me-n1" data-target="pageMenu"><em class="icon ni ni-more-v"></em></a>
|
||||||
|
<div class="toggle-expand-content" data-content="pageMenu">
|
||||||
|
<ul class="nk-block-tools g-3">
|
||||||
|
<li>
|
||||||
|
<div class="drodown">
|
||||||
|
<a href="#" class="dropdown-toggle btn btn-white btn-dim btn-outline-light" data-bs-toggle="dropdown"><em class="d-none d-sm-inline icon ni ni-calender-date"></em><span><span class="d-none d-md-inline">Last</span> 30 Days</span><em class="dd-indc icon ni ni-chevron-right"></em></a>
|
||||||
|
<div class="dropdown-menu dropdown-menu-end">
|
||||||
|
<ul class="link-list-opt no-bdr">
|
||||||
|
<li><a href="#"><span>Last 30 Days</span></a></li>
|
||||||
|
<li><a href="#"><span>Last 6 Months</span></a></li>
|
||||||
|
<li><a href="#"><span>Last 1 Years</span></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="nk-block-tools-opt"><a href="{{route('dashboard.classifications.create')}}" class="btn btn-primary"><em class="icon ni ni-plus"></em><span>Tambah</span></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div> --}}
|
||||||
|
</div><!-- .nk-block-between -->
|
||||||
|
</div><!-- .nk-block-head -->
|
||||||
|
<div class="nk-block nk-block-lg">
|
||||||
|
<div class="card card-bordered card-preview">
|
||||||
|
<div class="card-inner">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-striped table-bordered nowrap" id="rolesTable" border="1">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th style="width: 10% !important;">No</th>
|
||||||
|
<th>Nama</th>
|
||||||
|
<th>Jumlah Akun</th>
|
||||||
|
<th style="width: 10% !important;"></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- content @e -->
|
||||||
|
@include('partials.dashboard.footer' ,['datatable' => 'role'])
|
||||||
106
resources/views/dashboard/users/create.blade.php
Normal file
106
resources/views/dashboard/users/create.blade.php
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
@include('partials.dashboard.head')
|
||||||
|
@include('partials.dashboard.sidebar', ['page' => 'users'])
|
||||||
|
@include('partials.dashboard.header')
|
||||||
|
<!-- content @s -->
|
||||||
|
<div class="nk-content ">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="nk-content-inner">
|
||||||
|
<div class="nk-content-body">
|
||||||
|
<div class="nk-block nk-block-lg">
|
||||||
|
<div class="card card-bordered card-preview">
|
||||||
|
<div class="card-inner">
|
||||||
|
<div class="card-head">
|
||||||
|
<h5 class="card-title">{{$title}}</h5>
|
||||||
|
</div>
|
||||||
|
<form action="{{route('dashboard.users.store')}}" method="post">
|
||||||
|
@csrf
|
||||||
|
<div class="row g-4">
|
||||||
|
<div class="col-lg-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label" for="name">Nama<span class="required-input">*</span></label>
|
||||||
|
<div class="form-control-wrap">
|
||||||
|
<input type="text" class="form-control @error('name') border-danger @enderror" id="name" name="name" placeholder="Masukan nama" value="{{old('name')}}">
|
||||||
|
</div>
|
||||||
|
@error('name')
|
||||||
|
<span class="validation-error">{{$message}}</span>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label" for="email">Email<span class="required-input">*</span></label>
|
||||||
|
<div class="form-control-wrap">
|
||||||
|
<input type="email" class="form-control @error('email') border-danger @enderror" id="email" name="email" placeholder="Masukan email" value="{{old('email')}}">
|
||||||
|
</div>
|
||||||
|
@error('email')
|
||||||
|
<span class="validation-error">{{$message}}</span>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label">Role<span class="required-input">*</span></label>
|
||||||
|
<div class="form-control-wrap">
|
||||||
|
<select class="form-select js-select2" name="role_id">
|
||||||
|
@foreach ($roles as $role)
|
||||||
|
@if ($role->id != '3')
|
||||||
|
<option value="{{$role->id}}" {{old('role_id') == $role->id ? 'selected' : ''}}>{{$role->name}}</option>
|
||||||
|
@endif
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label">Status<span class="required-input">*</span></label>
|
||||||
|
<div class="form-control-wrap">
|
||||||
|
<select class="form-select js-select2" name="status">
|
||||||
|
<option value="1" {{old('status') === '1' ? 'selected' : ''}}>Aktif</option>
|
||||||
|
<option value="2" {{old('status') === '2' ? 'selected' : ''}}>Nonaktif</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row g-4 mt-1">
|
||||||
|
<div class="col-lg-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label" for="password">Password<span class="required-input">*</span></label>
|
||||||
|
<div class="form-control-wrap">
|
||||||
|
<input type="password" class="form-control @error('password') border-danger @enderror" id="password" name="password" placeholder="Masukan password" value="{{old('password')}}">
|
||||||
|
</div>
|
||||||
|
@error('password')
|
||||||
|
<span class="validation-error">{{$message}}</span>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label" for="password_confirmation">Ulangi Password<span class="required-input">*</span></label>
|
||||||
|
<div class="form-control-wrap">
|
||||||
|
<input type="password" class="form-control @error('password_confirmation') border-danger @enderror" id="password_confirmation" name="password_confirmation" placeholder="Ulangi Password" value="{{old('password_confirmation')}}">
|
||||||
|
</div>
|
||||||
|
@error('password_confirmation')
|
||||||
|
<span class="validation-error">{{$message}}</span>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-12">
|
||||||
|
<hr>
|
||||||
|
<div class="form-group d-flex justify-content-end">
|
||||||
|
<a href="{{route('dashboard.users.index')}}" class="btn btn-white btn-dim btn-outline-light mx-2"><span>Kembali</span></a>
|
||||||
|
<button type="submit" class="btn btn-md btn-primary">Tambahkan</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- content @e -->
|
||||||
|
@include('partials.dashboard.footer', ['rich_editor' => false])
|
||||||
83
resources/views/dashboard/users/edit.blade.php
Normal file
83
resources/views/dashboard/users/edit.blade.php
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
@include('partials.dashboard.head')
|
||||||
|
@include('partials.dashboard.sidebar', ['page' => 'users'])
|
||||||
|
@include('partials.dashboard.header')
|
||||||
|
<!-- content @s -->
|
||||||
|
<div class="nk-content ">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="nk-content-inner">
|
||||||
|
<div class="nk-content-body">
|
||||||
|
<div class="nk-block nk-block-lg">
|
||||||
|
<div class="card card-bordered card-preview">
|
||||||
|
<div class="card-inner">
|
||||||
|
<div class="card-head">
|
||||||
|
<h5 class="card-title">{{$title}}</h5>
|
||||||
|
</div>
|
||||||
|
<form action="{{route('dashboard.users.update', ['id' => encrypt_id($user->id)])}}" method="post">
|
||||||
|
@csrf
|
||||||
|
@method('put')
|
||||||
|
<div class="row g-4">
|
||||||
|
<div class="col-lg-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label" for="name">Nama<span class="required-input">*</span></label>
|
||||||
|
<div class="form-control-wrap">
|
||||||
|
<input type="text" class="form-control @error('name') border-danger @enderror" id="name" name="name" placeholder="Masukan nama" value="{{$user->name}}">
|
||||||
|
</div>
|
||||||
|
@error('name')
|
||||||
|
<span class="validation-error">{{$message}}</span>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label" for="email">Email<span class="required-input">*</span></label>
|
||||||
|
<div class="form-control-wrap">
|
||||||
|
<input type="email" class="form-control @error('email') border-danger @enderror" id="email" name="email" placeholder="Masukan email" value="{{$user->email}}">
|
||||||
|
</div>
|
||||||
|
@error('email')
|
||||||
|
<span class="validation-error">{{$message}}</span>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label">Role<span class="required-input">*</span></label>
|
||||||
|
<div class="form-control-wrap">
|
||||||
|
<select class="form-select js-select2" name="role_id">
|
||||||
|
@foreach ($roles as $role)
|
||||||
|
@if ($role->id != '3')
|
||||||
|
<option value="{{$role->id}}" {{$user->role_id == $role->id ? 'selected' : ''}}>{{$role->name}}</option>
|
||||||
|
@endif
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label">Status<span class="required-input">*</span></label>
|
||||||
|
<div class="form-control-wrap">
|
||||||
|
<select class="form-select js-select2" name="status">
|
||||||
|
<option value="1" {{$user->status === '1' ? 'selected' : ''}}>Aktif</option>
|
||||||
|
<option value="2" {{$user->status === '2' ? 'selected' : ''}}>Nonaktif</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-12">
|
||||||
|
<hr>
|
||||||
|
<div class="form-group d-flex justify-content-end">
|
||||||
|
<a href="{{route('dashboard.users.index')}}" class="btn btn-white btn-dim btn-outline-light mx-2"><span>Kembali</span></a>
|
||||||
|
<button type="submit" class="btn btn-md btn-primary">Simpan</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- content @e -->
|
||||||
|
@include('partials.dashboard.footer', ['rich_editor' => false])
|
||||||
63
resources/views/dashboard/users/index.blade.php
Normal file
63
resources/views/dashboard/users/index.blade.php
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
@include('partials.dashboard.head')
|
||||||
|
@include('partials.dashboard.sidebar', ['page' => 'users'])
|
||||||
|
@include('partials.dashboard.header')
|
||||||
|
<!-- content @s -->
|
||||||
|
<div class="nk-content ">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="nk-content-inner">
|
||||||
|
<div class="nk-content-body">
|
||||||
|
<div class="nk-block-head nk-block-head-sm">
|
||||||
|
<div class="nk-block-between">
|
||||||
|
<div class="nk-block-head-content">
|
||||||
|
<h3 class="nk-block-title page-title">{{$title}}</h3>
|
||||||
|
</div><!-- .nk-block-head-content -->
|
||||||
|
<div class="nk-block-head-content">
|
||||||
|
<div class="toggle-wrap nk-block-tools-toggle">
|
||||||
|
<a href="#" class="btn btn-icon btn-trigger toggle-expand me-n1" data-target="pageMenu"><em class="icon ni ni-more-v"></em></a>
|
||||||
|
<div class="toggle-expand-content" data-content="pageMenu">
|
||||||
|
<ul class="nk-block-tools g-3">
|
||||||
|
{{-- <li>
|
||||||
|
<div class="drodown">
|
||||||
|
<a href="#" class="dropdown-toggle btn btn-white btn-dim btn-outline-light" data-bs-toggle="dropdown"><em class="d-none d-sm-inline icon ni ni-calender-date"></em><span><span class="d-none d-md-inline">Last</span> 30 Days</span><em class="dd-indc icon ni ni-chevron-right"></em></a>
|
||||||
|
<div class="dropdown-menu dropdown-menu-end">
|
||||||
|
<ul class="link-list-opt no-bdr">
|
||||||
|
<li><a href="#"><span>Last 30 Days</span></a></li>
|
||||||
|
<li><a href="#"><span>Last 6 Months</span></a></li>
|
||||||
|
<li><a href="#"><span>Last 1 Years</span></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li> --}}
|
||||||
|
<li class="nk-block-tools-opt"><a href="{{route('dashboard.users.create')}}" class="btn btn-primary"><em class="icon ni ni-plus"></em><span>Tambah</span></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div><!-- .nk-block-head-content -->
|
||||||
|
</div><!-- .nk-block-between -->
|
||||||
|
</div><!-- .nk-block-head -->
|
||||||
|
<div class="nk-block nk-block-lg">
|
||||||
|
<div class="card card-bordered card-preview">
|
||||||
|
<div class="card-inner">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-striped table-bordered nowrap" id="usersTable" border="1">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th style="width: 10% !important;">No</th>
|
||||||
|
<th>Nama</th>
|
||||||
|
<th>Email</th>
|
||||||
|
<th>Role</th>
|
||||||
|
<th>Status</th>
|
||||||
|
<th style="width: 10% !important;"></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- content @e -->
|
||||||
|
@include('partials.dashboard.footer' ,['datatable' => 'user'])
|
||||||
78
resources/views/dashboard/users/reset-password.blade.php
Normal file
78
resources/views/dashboard/users/reset-password.blade.php
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
@include('partials.dashboard.head')
|
||||||
|
@include('partials.dashboard.sidebar', ['page' => 'users'])
|
||||||
|
@include('partials.dashboard.header')
|
||||||
|
<!-- content @s -->
|
||||||
|
<div class="nk-content ">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="nk-content-inner">
|
||||||
|
<div class="nk-content-body">
|
||||||
|
<div class="nk-block nk-block-middle nk-auth-body wide-xs">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-inner card-inner-lg">
|
||||||
|
<div class="nk-block-head">
|
||||||
|
<div class="nk-block-head-content">
|
||||||
|
<h5 class="nk-block-title">Reset Kata Sandi</h5>
|
||||||
|
<div class="nk-block-des">
|
||||||
|
<p>Ubah kata sandi akun dan login menggunakan kata sandi baru.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<form action="{{route('dashboard.users.reset.password.action', ['id' => encrypt_id($user->id)])}}" method="post">
|
||||||
|
@csrf
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="form-label-group">
|
||||||
|
<label class="form-label" for="account-name">Nama Akun</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-control-wrap">
|
||||||
|
<input type="text" class="form-control form-control-lg" id="account-name" value="{{$user->name}}" readonly>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="form-label-group">
|
||||||
|
<label class="form-label" for="new-password">Kata Sandi Baru</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-control-wrap">
|
||||||
|
<input type="password" class="form-control form-control-lg" id="new-password" placeholder="Masukan kata sandi baru" name="password">
|
||||||
|
</div>
|
||||||
|
@error('password')
|
||||||
|
<span class="validation-error">{{$message}}</span>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="form-label-group">
|
||||||
|
<label class="form-label" for="repeat-new-password">Ulangi Kata Sandi Baru</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-control-wrap">
|
||||||
|
<input type="password" class="form-control form-control-lg" id="repeat-new-password" placeholder="Ulangi kata sandi baru" name="password_confirmation">
|
||||||
|
</div>
|
||||||
|
@error('password_confirmation')
|
||||||
|
<span class="validation-error">{{$message}}</span>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="form-label-group">
|
||||||
|
<label class="form-label" for="your-password">Kata Sandi Anda ({{Auth::user()->name}})</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-control-wrap">
|
||||||
|
<input type="password" class="form-control form-control-lg" id="your-password" placeholder="Kata sandi Anda" name="my_password">
|
||||||
|
</div>
|
||||||
|
@error('my_password')
|
||||||
|
<span class="validation-error">{{$message}}</span>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<button class="btn btn-lg btn-primary btn-block">Reset Kata Sandi</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<div class="form-note-s2 text-center pt-4">
|
||||||
|
<a href="{{route('dashboard.users.index')}}"><strong>Kembali</strong></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- content @e -->
|
||||||
|
@include('partials.dashboard.footer', ['rich_editor' => false])
|
||||||
68
resources/views/dashboard/users/show.blade.php
Normal file
68
resources/views/dashboard/users/show.blade.php
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
@include('partials.dashboard.head')
|
||||||
|
@include('partials.dashboard.sidebar', ['page' => 'users'])
|
||||||
|
@include('partials.dashboard.header')
|
||||||
|
<!-- content @s -->
|
||||||
|
<div class="nk-content ">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="nk-content-inner">
|
||||||
|
<div class="nk-content-body">
|
||||||
|
<div class="nk-block nk-block-lg">
|
||||||
|
<div class="card card-bordered card-preview">
|
||||||
|
<div class="card-inner">
|
||||||
|
<div class="card-head">
|
||||||
|
<h5 class="card-title">Detail Akun Pengguna</h5>
|
||||||
|
</div>
|
||||||
|
<form action="{{route('dashboard.users.update', ['id' => encrypt_id($user->id)])}}" method="post">
|
||||||
|
@csrf
|
||||||
|
@method('put')
|
||||||
|
<div class="row g-4">
|
||||||
|
<div class="col-lg-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label" for="name">Nama</label>
|
||||||
|
<div class="form-control-wrap">
|
||||||
|
<input type="text" class="form-control @error('name') border-danger @enderror" id="name" name="name" placeholder="Masukan nama" value="{{$user->name}}" readonly>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label" for="email">Email</label>
|
||||||
|
<div class="form-control-wrap">
|
||||||
|
<input type="email" class="form-control @error('email') border-danger @enderror" id="email" name="email" placeholder="Masukan email" value="{{$user->email}}" readonly>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label" for="role">Role</label>
|
||||||
|
<div class="form-control-wrap">
|
||||||
|
<input type="text" class="form-control @error('role') border-danger @enderror" id="role" name="role" placeholder="Masukan role" value="{{$user->role->name}}" readonly>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label" for="status">Status</label>
|
||||||
|
<div class="form-control-wrap">
|
||||||
|
<input type="text" class="form-control @error('status') border-danger @enderror" id="status" name="status" placeholder="Masukan status" value="{{get_user_status($user->status)}}" readonly>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-12">
|
||||||
|
<hr>
|
||||||
|
<div class="form-group d-flex justify-content-end">
|
||||||
|
<a href="{{route('dashboard.users.index')}}" class="btn btn-white btn-dim btn-outline-light mx-2"><span>Kembali</span></a>
|
||||||
|
<a href="{{route('dashboard.users.index')}}" class="btn btn-warning"><span>Ubah</span></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- content @e -->
|
||||||
|
@include('partials.dashboard.footer', ['rich_editor' => false])
|
||||||
@ -163,3 +163,50 @@
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
|
@if ($datatable === 'user')
|
||||||
|
<script>
|
||||||
|
$(document).ready(function() {
|
||||||
|
$('#usersTable').DataTable({
|
||||||
|
processing: true,
|
||||||
|
serverSide: true,
|
||||||
|
ajax: '{{ route('dashboard.users.data', ["role" => $role]) }}',
|
||||||
|
columns: [
|
||||||
|
{ data: 'DT_RowIndex', name: 'DT_RowIndex', orderable: false, searchable: false },
|
||||||
|
{ data: 'name', name: 'name' },
|
||||||
|
{ data: 'email', name: 'email' },
|
||||||
|
{ data: 'role', name: 'role' },
|
||||||
|
{ data: 'status', name: 'status' },
|
||||||
|
{ data: 'action', name: 'action', orderable: false, searchable: false },
|
||||||
|
{ data: 'id', name: 'id', orderable: true, searchable: false, visible: false },
|
||||||
|
],
|
||||||
|
language: datatableLanguage,
|
||||||
|
autoWidth: false,
|
||||||
|
order: [[1, 'desc']],
|
||||||
|
lengthMenu: [[10, 25, 50, 100, -1], ['Tampilkan 10 data', 'Tampilkan 25 data', 'Tampilkan 50 data', 'Tampilkan 100 data', 'Tampilkan semua']]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if ($datatable === 'role')
|
||||||
|
<script>
|
||||||
|
$(document).ready(function() {
|
||||||
|
$('#rolesTable').DataTable({
|
||||||
|
processing: true,
|
||||||
|
serverSide: true,
|
||||||
|
ajax: '{{ route('dashboard.role.data') }}',
|
||||||
|
columns: [
|
||||||
|
{ data: 'DT_RowIndex', name: 'DT_RowIndex', orderable: false, searchable: false },
|
||||||
|
{ data: 'name', name: 'name' },
|
||||||
|
{ data: 'account_count', name: 'account_count' },
|
||||||
|
{ data: 'id', name: 'id', orderable: true, searchable: false, visible: false },
|
||||||
|
],
|
||||||
|
language: datatableLanguage,
|
||||||
|
autoWidth: false,
|
||||||
|
order: [[1, 'desc']],
|
||||||
|
lengthMenu: [[10, 25, 50, 100, -1], ['Tampilkan 10 data', 'Tampilkan 25 data', 'Tampilkan 50 data', 'Tampilkan 100 data', 'Tampilkan semua']]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endif
|
||||||
|
|||||||
@ -45,6 +45,53 @@ function deleteItem(url, message) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
<script>
|
||||||
|
$(document).ready(function() {
|
||||||
|
$.ajaxSetup({
|
||||||
|
headers: {
|
||||||
|
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function statusAction(url, message, confirmButtonAction) {
|
||||||
|
Swal.fire({
|
||||||
|
title: 'Apakah Anda yakin?',
|
||||||
|
text: message,
|
||||||
|
icon: 'warning',
|
||||||
|
showCancelButton: true,
|
||||||
|
confirmButtonColor: '#3085d6',
|
||||||
|
cancelButtonColor: '#d33',
|
||||||
|
confirmButtonText: confirmButtonAction,
|
||||||
|
cancelButtonText: 'Batal',
|
||||||
|
reverseButtons: true
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
$.ajax({
|
||||||
|
type: "PUT",
|
||||||
|
url: url,
|
||||||
|
success: function(response) {
|
||||||
|
$('#usersTable').DataTable().ajax.reload();
|
||||||
|
Swal.fire(
|
||||||
|
'Proses Berhasil!',
|
||||||
|
response.message,
|
||||||
|
'success'
|
||||||
|
).then(() => {
|
||||||
|
location.reload();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
error: function(xhr) {
|
||||||
|
Swal.fire(
|
||||||
|
'Terjadi kesalahan!',
|
||||||
|
xhr.responseText,
|
||||||
|
'error'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@if (session('success-status'))
|
@if (session('success-status'))
|
||||||
<script>
|
<script>
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
|
|||||||
@ -160,13 +160,13 @@
|
|||||||
<h6 class="overline-title text-primary-alt">Autentikasi</h6>
|
<h6 class="overline-title text-primary-alt">Autentikasi</h6>
|
||||||
</li><!-- .nk-menu-item -->
|
</li><!-- .nk-menu-item -->
|
||||||
<li class="nk-menu-item">
|
<li class="nk-menu-item">
|
||||||
<a href="javascript:void(0);" class="nk-menu-link">
|
<a href="{{route('dashboard.users.index')}}" class="nk-menu-link {{$page === 'users' ? 'active-page' : ''}}">
|
||||||
<span class="nk-menu-icon"><em class="icon ni ni-users"></em></span>
|
<span class="nk-menu-icon"><em class="icon ni ni-users"></em></span>
|
||||||
<span class="nk-menu-text">Pengguna</span>
|
<span class="nk-menu-text">Pengguna</span>
|
||||||
</a>
|
</a>
|
||||||
</li><!-- .nk-menu-item -->
|
</li><!-- .nk-menu-item -->
|
||||||
<li class="nk-menu-item">
|
<li class="nk-menu-item">
|
||||||
<a href="javascript:void(0);" class="nk-menu-link">
|
<a href="{{route('dashboard.role.index')}}" class="nk-menu-link {{$page === 'roles' ? 'active-page' : ''}}">
|
||||||
<span class="nk-menu-icon"><em class="icon ni ni-shield"></em></span>
|
<span class="nk-menu-icon"><em class="icon ni ni-shield"></em></span>
|
||||||
<span class="nk-menu-text">Role</span>
|
<span class="nk-menu-text">Role</span>
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@ -8,8 +8,10 @@
|
|||||||
use App\Http\Controllers\Dashboard\GovernmentAgencyController;
|
use App\Http\Controllers\Dashboard\GovernmentAgencyController;
|
||||||
use App\Http\Controllers\Dashboard\NewsController;
|
use App\Http\Controllers\Dashboard\NewsController;
|
||||||
use App\Http\Controllers\Dashboard\OverviewController;
|
use App\Http\Controllers\Dashboard\OverviewController;
|
||||||
|
use App\Http\Controllers\Dashboard\RoleController;
|
||||||
use App\Http\Controllers\Dashboard\SettingController;
|
use App\Http\Controllers\Dashboard\SettingController;
|
||||||
use App\Http\Controllers\Dashboard\SubClassificationController;
|
use App\Http\Controllers\Dashboard\SubClassificationController;
|
||||||
|
use App\Http\Controllers\Dashboard\UserController;
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
|
|
||||||
Route::get('/', function () {
|
Route::get('/', function () {
|
||||||
@ -126,5 +128,30 @@
|
|||||||
|
|
||||||
Route::get('/data', [DatatableController::class, 'contentRecap'])->name('data');
|
Route::get('/data', [DatatableController::class, 'contentRecap'])->name('data');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Route::prefix('users')->name('users.')->group(function(){
|
||||||
|
Route::controller(UserController::class)->group(function(){
|
||||||
|
Route::get('/', 'index')->name('index');
|
||||||
|
Route::get('/create', 'create')->name('create');
|
||||||
|
Route::post('/', 'store')->name('store');
|
||||||
|
Route::get('/{id}/show', 'show')->name('show');
|
||||||
|
Route::get('/{id}/edit', 'edit')->name('edit');
|
||||||
|
Route::put('/{id}', 'update')->name('update');
|
||||||
|
Route::get('/{id}/reset', 'resetPassword')->name('reset.password');
|
||||||
|
Route::post('/{id}/reset', 'resetPasswordAction')->name('reset.password.action');
|
||||||
|
Route::put('/{id}/{action}/status', 'statusAction')->name('status.action');
|
||||||
|
Route::delete('/{id}', 'destroy')->name('destroy');
|
||||||
|
});
|
||||||
|
|
||||||
|
Route::get('/data', [DatatableController::class, 'user'])->name('data');
|
||||||
|
});
|
||||||
|
|
||||||
|
Route::prefix('roles')->name('role.')->group(function(){
|
||||||
|
Route::controller(RoleController::class)->group(function(){
|
||||||
|
Route::get('/', 'index')->name('index');
|
||||||
|
});
|
||||||
|
|
||||||
|
Route::get('/data', [DatatableController::class, 'role'])->name('data');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user