From cc7003752f2162e077da3d3cde6d1f2d8646bb65 Mon Sep 17 00:00:00 2001 From: ilhamwara Date: Wed, 21 May 2025 13:31:05 +0700 Subject: [PATCH] UPDATE --- app/Helpers/custom.php | 345 ++++++ .../Auth/ConfirmPasswordController.php | 39 + .../Auth/CustomLoginController.php | 107 ++ .../Auth/CustomRegisterController.php | 57 + .../Auth/ForgotPasswordController.php | 22 + app/Http/Controllers/Auth/LoginController.php | 40 + .../Controllers/Auth/RegisterController.php | 72 ++ .../Auth/ResetPasswordController.php | 29 + .../Auth/VerificationController.php | 41 + app/Http/Controllers/Controller.php | 8 +- app/Http/Controllers/HomeController.php | 93 +- .../Management/AksesController.php | 344 ++++++ .../Controllers/Management/RoleController.php | 174 +++ .../Controllers/Management/UserController.php | 245 +++++ .../Controllers/ManagementUserController.php | 64 ++ app/Http/Middleware/Session.php | 27 + app/Models/Group.php | 10 - app/Models/Log.php | 24 + app/Models/Master/Group.php | 12 + app/Models/Master/Menu.php | 205 ++++ app/Models/Master/MenuAccess.php | 12 + composer.json | 8 +- composer.lock | 69 +- .../2025_05_21_035311_create_table_menu.php | 38 + ...025_05_21_035347_create_table_ms_group.php | 32 + ..._21_035406_create_table_ms_access_menu.php | 42 + ...5_05_21_035435_add_foreignkey_tbl_user.php | 29 + .../2025_05_21_035450_create_table_log.php | 35 + database/seeders/DatabaseSeeder.php | 33 +- package.json | 3 + resources/js/bootstrap.js | 30 + resources/sass/_variables.scss | 7 + resources/sass/app.scss | 8 + .../admin/layout-admin/sidebar.blade.php | 121 +-- resources/views/auth/login.blade.php | 59 ++ .../views/auth/passwords/confirm.blade.php | 49 + .../views/auth/passwords/email.blade.php | 47 + .../views/auth/passwords/reset.blade.php | 65 ++ resources/views/auth/register.blade.php | 86 ++ resources/views/auth/verify.blade.php | 28 + resources/views/dashboard.blade.php | 2 +- resources/views/home.blade.php | 23 + resources/views/include/sidebar.blade.php | 997 +----------------- resources/views/layout/footer.blade.php | 91 -- resources/views/layout/head.blade.php | 30 - resources/views/layout/master.blade.php | 805 -------------- resources/views/layout/navbar.blade.php | 35 - resources/views/layout/script.blade.php | 39 - resources/views/layouts/app.blade.php | 80 ++ resources/views/layouts/master.blade.php | 96 ++ .../management/role/akses/form.blade.php | 275 +++++ .../modules/management/role/form.blade.php | 35 + .../modules/management/role/index.blade.php | 85 ++ .../modules/management/user/form.blade.php | 92 ++ .../modules/management/user/index.blade.php | 128 +++ routes/modules/modules.php | 32 + routes/web.php | 49 +- vite.config.js | 5 +- 58 files changed, 3531 insertions(+), 2127 deletions(-) create mode 100644 app/Helpers/custom.php create mode 100644 app/Http/Controllers/Auth/ConfirmPasswordController.php create mode 100644 app/Http/Controllers/Auth/CustomLoginController.php create mode 100644 app/Http/Controllers/Auth/CustomRegisterController.php create mode 100644 app/Http/Controllers/Auth/ForgotPasswordController.php create mode 100644 app/Http/Controllers/Auth/LoginController.php create mode 100644 app/Http/Controllers/Auth/RegisterController.php create mode 100644 app/Http/Controllers/Auth/ResetPasswordController.php create mode 100644 app/Http/Controllers/Auth/VerificationController.php create mode 100644 app/Http/Controllers/Management/AksesController.php create mode 100644 app/Http/Controllers/Management/RoleController.php create mode 100644 app/Http/Controllers/Management/UserController.php create mode 100644 app/Http/Controllers/ManagementUserController.php create mode 100644 app/Http/Middleware/Session.php delete mode 100644 app/Models/Group.php create mode 100644 app/Models/Log.php create mode 100644 app/Models/Master/Group.php create mode 100644 app/Models/Master/Menu.php create mode 100644 app/Models/Master/MenuAccess.php create mode 100644 database/migrations/2025_05_21_035311_create_table_menu.php create mode 100644 database/migrations/2025_05_21_035347_create_table_ms_group.php create mode 100644 database/migrations/2025_05_21_035406_create_table_ms_access_menu.php create mode 100644 database/migrations/2025_05_21_035435_add_foreignkey_tbl_user.php create mode 100644 database/migrations/2025_05_21_035450_create_table_log.php create mode 100644 resources/sass/_variables.scss create mode 100644 resources/sass/app.scss create mode 100644 resources/views/auth/login.blade.php create mode 100644 resources/views/auth/passwords/confirm.blade.php create mode 100644 resources/views/auth/passwords/email.blade.php create mode 100644 resources/views/auth/passwords/reset.blade.php create mode 100644 resources/views/auth/register.blade.php create mode 100644 resources/views/auth/verify.blade.php create mode 100644 resources/views/home.blade.php delete mode 100644 resources/views/layout/footer.blade.php delete mode 100644 resources/views/layout/head.blade.php delete mode 100644 resources/views/layout/master.blade.php delete mode 100644 resources/views/layout/navbar.blade.php delete mode 100644 resources/views/layout/script.blade.php create mode 100644 resources/views/layouts/app.blade.php create mode 100644 resources/views/layouts/master.blade.php create mode 100644 resources/views/modules/management/role/akses/form.blade.php create mode 100644 resources/views/modules/management/role/form.blade.php create mode 100644 resources/views/modules/management/role/index.blade.php create mode 100644 resources/views/modules/management/user/form.blade.php create mode 100644 resources/views/modules/management/user/index.blade.php create mode 100644 routes/modules/modules.php diff --git a/app/Helpers/custom.php b/app/Helpers/custom.php new file mode 100644 index 0000000..5dc9368 --- /dev/null +++ b/app/Helpers/custom.php @@ -0,0 +1,345 @@ + $request->route()->getAction('prefix'), + 'task' => taskLabel($request->route()->getActionMethod()), + 'user_id' => session('uid'), + 'ipaddress' => $request->getClientIp(), + 'useragent' => $request->header('User-Agent'), + 'note' => $note, + 'created_at' => \Carbon\Carbon::now() + ]; + + if (session('superuser') == false) + $repository->create($data); + } +} + + +if (!function_exists('trimId')) { + /** + * @param $val + * @return array + */ + function trimId($val) + { + $string = explode('+', $val); + return $string; + } +} + + +if (!function_exists('dateTime')) { + /** + * make secure id + * + * @param string|null $val + * + * @return string + */ + function dateTime($date) + { + return date('d-m-Y H:i:s',strtotime(@$date)); + } +} + +if (!function_exists('encode_id')) { + /** + * make secure id + * + * @param string|null $val + * + * @return string + */ + function encode_id(?string $val = ''): string + { + $params = ['val' => $val]; + return rtrim(base64_encode(serialize($params)), "="); + } +} + +if (!function_exists('decode_id')) { + /** + * @param string|null $val + * ${STATIC} + * + * @return mixed|null + * @author alex.gz + * @created 02/12/2023 4:28 + * + */ + function decode_id(?string $val = ''): mixed + { + $secure = unserialize(base64_decode($val)); + return $secure ? $secure['val'] : null; + } +} + +if (!function_exists('permission')) { + /** + * @param $access + * @param $key + * @param string $method + * @param bool $view + * + * @return mixed + */ + function permission($access, $key, string $method = 'menu', bool $view = false): mixed + { + if (@session('group_id') != 1) { + if ($method == 'module') { + if (is_array($access)) { + $model = MenuAccess::where('module', 'LIKE', "{$key}%")->where('ms_group_id', session('group_id'))->first(); + $query = count(array_intersect((array)$access, (array)$model->access)); + } else { + $query = MenuAccess::where($access, true)->where('module', 'LIKE', $key.'%')->where('ms_group_id', session('group_id'))->count(); + if ($query > 0) { + return true; + } else { + return abort('401'); + } + } + } else { + $query = MenuAccess::where($access, true)->where('ms_menu_id', $key)->where('ms_group_id', session('group_id'))->count(); + } + + if ($query > 0) { + return true; + } else { + return false; + } + } else { + return true; + } + + } +} + +if (!function_exists('access')) { + /** + * @param $access + * @param $key + * + * @return bool + */ + function access($access, $key) + { + if (session('group_alias') != 'administrator') { + $query = MenuAccess::where($access, 1)->where('module', $key)->where('ms_group_id', session('group_id'))->count(); + if ($query > 0) { + return true; + } else if (session('group_alias') == 'administrator') { + return true; + } else { + return false; + } + } else { + return true; + } + } +} + +if (!function_exists('activeMenuClass')) { + /** + * Helper to grab the application version. + * + * @return mixed + */ + function activeMenuClass($route){ + // dd(request()->route()->getName()); + // if(request()->route()->getName() == $route){ + // return true; + // }else{ + // return false; + // } + + if (\Str::is($route, request()->route()->getName())) { + return true; + } else { + return false; + } + } + +} + +if (!function_exists('renderMenu')) { + + /** + * Loops through a folder and requires all PHP files + * Searches sub-directories as well. + * + * @param $folder + */ + function renderMenu() + { + + $parent = Menu::where('status',true)->where('menu_type','sidebar')->where('parent_id',0)->orderBy('ordering','ASC')->get(); + $html = ''; + foreach ($parent as $p1) { + // echo $p1->MsMenuId.'
'; + $child2 = Menu::where('status',true)->where('menu_type','sidebar')->where('parent_id',$p1->MsMenuId)->get(); + $access1 = permission('is_read', $p1->MsMenuId, 'menu', true); + + $ch1 = count($child2) > 0 ? '' : ''; + $link1 = count($child2) > 0 ? '' : 'nav-link menu-link'; + $collapse1 = count($child2) > 0 ? 'data-fc-type="collapse"' : ''; + $active = activeMenuClass($p1->module) ? 'active' : ''; + // dd($p1->route); + + if ($access1) { + $active1 = activeMenuClass($p1->module) ? 'active' : ''; + + if (count($child2) > 0) { + $href1 = 'data-bs-toggle="collapse" role="button" aria-expanded="false" aria-controls="'.$p1->MsMenuId.'" href="#key'.$p1->MsMenuId.'"'; + }else{ + $href1 = 'href="'.url($p1->url).'"'; + } + + $html .= ''; + } + } + return $html; + } +} + +if (!function_exists('include_route_files')) { + /** + * Loops through a folder and requires all PHP files + * Searches sub-directories as well. + * + * @param $folder + */ + function include_route_files($folder) + { + include_files_in_folder($folder); + } +} + +if (!function_exists('include_files_in_folder')) { + /** + * Loops through a folder and requires all PHP files + * Searches sub-directories as well. + * + * @param $folder + */ + function include_files_in_folder($folder) + { + try { + $rdi = new RecursiveDirectoryIterator($folder); + $it = new RecursiveIteratorIterator($rdi); + + while ($it->valid()) { + if (!$it->isDot() && $it->isFile() && $it->isReadable() && $it->current()->getExtension() === 'php') { + require $it->key(); + } + + $it->next(); + } + } catch (Exception $e) { + echo $e->getMessage(); + } + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Auth/ConfirmPasswordController.php b/app/Http/Controllers/Auth/ConfirmPasswordController.php new file mode 100644 index 0000000..3559954 --- /dev/null +++ b/app/Http/Controllers/Auth/ConfirmPasswordController.php @@ -0,0 +1,39 @@ +middleware('auth'); + } +} diff --git a/app/Http/Controllers/Auth/CustomLoginController.php b/app/Http/Controllers/Auth/CustomLoginController.php new file mode 100644 index 0000000..ad9248f --- /dev/null +++ b/app/Http/Controllers/Auth/CustomLoginController.php @@ -0,0 +1,107 @@ +all(), [ + 'email' => 'required', + 'password' => 'required', + ])->validate(); + + $credentials = array('email' => $request->email, 'password' => $request->password); + + $user = User::where('email', $credentials['email'])->first(); + if(!@$user){ + $user = User::where('username', $credentials['email'])->first(); + + if ($user && Hash::check($credentials['password'], $user->password)) { + // dd($user->group); + Auth::attempt(['username' => $request->email, 'password' => $request->password]); + + $session = [ + 'username' => $user->username, + 'name' => $user->name, + 'email' => $user->email, + 'currYear' => date('Y'), + 'group_id' => @$user->ms_group_id, + 'group_alias' => @$user->group->alias, + 'group_name' => @$user->group->name, + ]; + session($session); + + return redirect('dashboard')->with([ + 'message' => trans('Selamat datang kembali'), + 'type' => "success" + ]); + + }else{ + return redirect('/login') + ->withInput() + ->with([ + 'message' => trans('Akun anda tidak ditemukan'), + 'type' => "error" + ]); + } + }else{ + if ($user && Hash::check($credentials['password'], $user->password)) { + Auth::attempt(['email' => $request->email, 'password' => $request->password]); + + $session = [ + 'username' => $user->username, + 'name' => $user->name, + 'email' => $user->email, + 'currYear' => date('Y'), + 'group_id' => @$user->ms_group_id, + 'group_alias' => @$user->group->alias, + 'group_name' => @$user->group->name, + ]; + session($session); + + return redirect('dashboard')->with([ + 'message' => trans('Selamat datang kembali'), + 'type' => "success" + ]); + + }else{ + return redirect('/login') + ->withInput() + ->with([ + 'message' => trans('Akun anda tidak ditemukan'), + 'type' => "error" + ]); + } + } + + + } + + public function logout() + { + Auth::logout(); + return redirect('/login') + ->withInput() + ->with([ + 'message' => trans('Berhasil Keluar'), + 'type' => "success" + ]); + + } +} diff --git a/app/Http/Controllers/Auth/CustomRegisterController.php b/app/Http/Controllers/Auth/CustomRegisterController.php new file mode 100644 index 0000000..7eae5e4 --- /dev/null +++ b/app/Http/Controllers/Auth/CustomRegisterController.php @@ -0,0 +1,57 @@ +all()); + try { + Validator::make($request->all(), [ + 'email' => 'required|unique:users|email', + 'username' => 'required|unique:users,username', + 'password' => 'required|min:8|max:15|regex:/[a-z]/|regex:/[A-Z]/|regex:/[0-9]/|regex:/[@$!%*#?&]/', //min 8 char, maks 15 char, min 1 symbol, min 1 uppercase, min 1 lowercase, 1 number + ],[ + 'password.min' => 'password Minimal 8 Karakter', + 'password.max' => 'password Maksimal 15 Karakter', + 'password.regex' => 'Format Kata Sandi harus mengandung minimal Huruf Besar, Huruf Kecil, Angka, Spesial Karakter', + ])->validate(); + + $user = new User; + $user->email = $request->email; + $user->password = Hash::make($request->password); + $user->name = $request->name; + $user->username = $request->username; + $user->ms_group_id = 2; + $user->save(); + + return redirect('/login')->with([ + 'message' => 'Berhasil membuat akun baru, silahkan login', + 'type' => 'success', + ]); + + + } catch (Exception $e) { + return redirect('register')->with([ + 'message' => $e->getMessage(), + 'type' => "error" + ]); + } + } +} diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php new file mode 100644 index 0000000..465c39c --- /dev/null +++ b/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -0,0 +1,22 @@ +middleware('guest')->except('logout'); + $this->middleware('auth')->only('logout'); + } +} diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php new file mode 100644 index 0000000..961ea36 --- /dev/null +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -0,0 +1,72 @@ +middleware('guest'); + } + + /** + * Get a validator for an incoming registration request. + * + * @param array $data + * @return \Illuminate\Contracts\Validation\Validator + */ + protected function validator(array $data) + { + return Validator::make($data, [ + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], + 'password' => ['required', 'string', 'min:8', 'confirmed'], + ]); + } + + /** + * Create a new user instance after a valid registration. + * + * @param array $data + * @return \App\Models\User + */ + protected function create(array $data) + { + return User::create([ + 'name' => $data['name'], + 'email' => $data['email'], + 'password' => Hash::make($data['password']), + ]); + } +} diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php new file mode 100644 index 0000000..fe965b2 --- /dev/null +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -0,0 +1,29 @@ +middleware('auth'); + $this->middleware('signed')->only('verify'); + $this->middleware('throttle:6,1')->only('verify', 'resend'); + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 8677cd5..77ec359 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -2,7 +2,11 @@ namespace App\Http\Controllers; -abstract class Controller +use Illuminate\Foundation\Auth\Access\AuthorizesRequests; +use Illuminate\Foundation\Validation\ValidatesRequests; +use Illuminate\Routing\Controller as BaseController; + +class Controller extends BaseController { - // + use AuthorizesRequests, ValidatesRequests; } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 2751086..2feb200 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -6,89 +6,24 @@ use Illuminate\Http\Request; class HomeController extends Controller { - - public function home() + /** + * Create a new controller instance. + * + * @return void + */ + public function __construct() { - return view('landing-page.home'); - } - - // public function index() { - // return view('index'); - // } - - public function login() - { - return view('login.login'); - } - - public function register() - { - return view('login.register'); - } - - public function tes() - { - return view('login.tes'); - } - - public function backup() - { - return view('welcome'); + $this->middleware('auth'); } + /** + * Show the application dashboard. + * + * @return \Illuminate\Contracts\Support\Renderable + */ public function dashboard() { - return view('admin.dashboard-admin.dashboard'); + $data['title'] = 'Dashboard'; + return view('dashboard',$data); } - - public function dashboard2() - { - return view('dashboard'); - } - - public function admin() - { - return view('admin.admin'); - } - - public function profile() - { - return view('admin.profile.profile'); - } - - public function identitas_lokasi() - { - return view('admin.identitas_lokasi.identitas_lokasi'); - } - - public function data_dasar() - { - return view('admin.data_dasar.data_dasar'); - } - - public function informasi_perubahan() - { - return view('admin.informasi_perubahan.informasi_perubahan'); - } - - public function adaptasi_perubahan() - { - return view('admin.adaptasi_perubahan.adaptasi_perubahan'); - } - - - public function mitigasi_perubahan() - { - return view('admin.mitigasi.mitigasi_perubahan'); - } - - public function kelembagaan_masyarakat() - { - return view('admin.kelembagaan_masyarakat.kelembagaan_masyarakat'); - } - - // public function verifikasi_final() - // { - // return view('admin.verifikasi_final.verifikasi_final'); - // } } diff --git a/app/Http/Controllers/Management/AksesController.php b/app/Http/Controllers/Management/AksesController.php new file mode 100644 index 0000000..69599e1 --- /dev/null +++ b/app/Http/Controllers/Management/AksesController.php @@ -0,0 +1,344 @@ +route.'.'.$prefix; + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + permission('is_update', $this->getRoute(), false, 'module'); + $id = decode_id($request->group_id); + // dd($id); + $_read = []; + if ($request->has('is_read')) { + foreach ($request->input('is_read') as $val) { + $_read[] = ['ms_menu_id' => $val]; + } + } + + $_create = []; + if ($request->has('is_create')) { + foreach ($request->input('is_create') as $val) { + $_create[] = ['ms_menu_id' => $val]; + } + } + + $_update = []; + if ($request->has('is_update')) { + foreach ($request->input('is_update') as $val) { + $_update[] = ['ms_menu_id' => $val]; + } + } + + $_delete = []; + if ($request->has('is_delete')) { + foreach ($request->input('is_delete') as $val) { + $_delete[] = ['ms_menu_id' => $val]; + } + } + + $_download = []; + if ($request->has('is_download')) { + foreach ($request->input('is_download') as $val) { + $_download[] = ['ms_menu_id' => $val]; + } + } + + $merged = array_merge($_read, $_create, $_update, $_delete, $_download); + $result = []; + foreach ($merged as $key => $data) { + $access = trimId($data['ms_menu_id']); + $module = Menu::find($access[1]); + if (isset($result[$access[1]])) { + $result[$access[1]][$access[0]] = 1; + } else { + $result[$access[1]] = ['ms_menu_id' => intval($access[1]), $access[0] => 1, 'ms_group_id' => intval($id), 'module' => $module->module, 'menu_group' => $request->input('menu_group')]; + } + } + + /** + * Merge all privileges into json + */ + $group = Group::find(intval($id)); + if ($merged) { + $current = AccessMenu::where('menu_group',$request->input('menu_group'))->where('ms_group_id',intval($id))->get(); + $insert = null; + if ($current->count() > 0) { + $deletedRows = AccessMenu::where('menu_group',$request->input('menu_group'))->where('ms_group_id',intval($id))->delete(); + if ($deletedRows) { + foreach ($result as $val) { + $insert = AccessMenu::create($val); + } + } + } else { + foreach ($result as $val) { + $insert = AccessMenu::create($val); + } + } + + if ($insert) { + logActivity($request, __('Edit',['val' => strtolower(__('module.group.access.title',['val' => $group->name]))])); + return redirect('management/role/')->with('message', __('Berhasil Update Data')) + ->with('type', 'success'); + } else { + return redirect()->back()->with('message', __('Maaf Terjadi Kesalahan')) + ->with('type', 'invalid'); + } + } else { + $current = AccessMenu::where('menu_group',$request->input('menu_group'))->where('ms_group_id', intval($id))->count(); + if ($current > 0) { + AccessMenu::where('menu_group', $request->input('menu_group'))->where('ms_group_id', intval($id))->delete(); + logActivity($request, __('Delete',['val' => strtolower(__('Title',['val' => $group->name]))])); + return redirect('management/role/')->with('message', __('Berhasil Update Data')) + ->with('type', 'success'); + } else { + return redirect()->back()->with('message', __('Maaf Terjadi Kesalahan')) + ->with('type', 'invalid'); + } + } + } + + /** + * Display the specified resource. + */ + public function show(string $id) + { + // + } + + /** + * Show the form for editing the specified resource. + */ + public function edit($id) + { + $data['key'] = decode_id($id); + $data['id'] = decode_id($id); + $data['group'] = Group::where('MsGroupId',decode_id($id))->first(); + + $data['breadcrumbs'] = [ + ['name' => 'Dashboard','url' => url('dashboard')], + ['name' => 'Management & Akses Role'], + ['name' => 'Data Role','url' => url('management/role/')], + ['name' => 'Role '.$data['group']->name,'active' => true], + ]; + + $data['type'] = 'sidebar'; + // $data['groupMenus'] = Menu::where('status',true)->get(); + $data['menu'] = $this->getMenu($data['key'], $data['type']); + $data['title'] = $this->title.' '.$data['group']->name; + $data['route'] = $this->route; + return view($this->template.'.form',$data); + } + + public function getMenuByParentPosition($id, $type, $active = [1]) + { + return Menu::where('parent_id', '=', $id) + ->where('menu_type', '=', $type) + ->whereIn('status', $active) + ->orderBy('ordering') + ->get(); + } + + public function getParentByType($type) + { + return Menu::where('parent_id', '=', 0) + ->where('menu_type', '=', $type) + ->orderBy('ordering') + ->get(); + } + + public function getMenuByParent($id, $active = [1]) + { + return Menu::where('parent_id', '=', $id) + ->whereIn('status', $active) + ->orderBy('ordering') + ->get(); + } + + /** + * @param $id + * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model|null|object + */ + public function getActiveById($id) + { + return Menu::where('ms_menu_id', '=' , $id) + ->where('status', '=' , true) + ->first(); + } + + /** + * Get all active menu by menu position + * + * @param $type + * @return mixed + */ + public function getActiveByPosition($type) + { + return Menu::where('menu_type', '=' , $type) + ->where('status', '=' , true) + ->orderBy('ordering') + ->get(); + } + + /** + * @param $type + * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Eloquent\Model[] + */ + public function getParentByTypeStatus($type) + { + return Menu::where('parent_id', '=', 0) + ->where('menu_type', '=', $type) + ->where('status','=',true) + ->orderBy('ordering') + ->get(); + } + + public function getMenu($id, $type) + { + $parent = $this->getMenuByParentPosition(0,$type); + $_parent = []; + foreach ($parent as $row) { + $lev1 = $this->getMenuByParent($row->MsMenuId); + $_lev1 = []; + foreach ($lev1 as $l1) { + $lev2 = $this->getMenuByParent($l1->MsMenuId); + $_lev2 = []; + foreach ($lev2 as $l2) { + $lev3 = $this->getMenuByParent($l2->MsMenuId); + $_lev3 = []; + foreach ($lev3 as $l3) { + $lev4 = $this->getMenuByParent($l3->MsMenuId); + $_lev4 = []; + foreach ($lev4 as $l4) { + $lev4Access = AccessMenu::where('ms_group_id', '=', $id)->where('ms_menu_id', '=', $l4->MsMenuId)->first(); + $_lev4[] = [ + 'id' => $l4->MsMenuId, + 'title' => $l4->title, + 'ordering' => $l4->ordering, + 'checked' => [ + "is_create" => $lev4Access ? $lev4Access->is_create : 0, + "is_read" => $lev4Access ? $lev4Access->is_read : 0, + "is_update" => $lev4Access ? $lev4Access->is_update : 0, + "is_delete" => $lev4Access ? $lev4Access->is_delete : 0, + "is_download" => $lev4Access ? $lev4Access->is_download : 0, + ] + ]; + } + $lev3Access = AccessMenu::where('ms_group_id', '=', $id)->where('ms_menu_id', '=', $l3->MsMenuId)->first(); + $_lev3[] = [ + 'id' => $l3->MsMenuId, + 'title' => $l3->title . (!!$l3->meta_title?" ##Meta: ". $l3->meta_title:""), + 'ordering' => $l3->ordering, + 'level4' => $_lev4, + 'checked' => [ + "is_create" => $lev3Access ? $lev3Access->is_create : 0, + "is_read" => $lev3Access ? $lev3Access->is_read : 0, + "is_update" => $lev3Access ? $lev3Access->is_update : 0, + "is_delete" => $lev3Access ? $lev3Access->is_delete : 0, + "is_download" => $lev3Access ? $lev3Access->is_download : 0, + ] + ]; + } + $lev2Access = AccessMenu::where('ms_group_id', '=', $id)->where('ms_menu_id', '=', $l2->MsMenuId)->first(); + $_lev2[] = [ + 'id' => $l2->MsMenuId, + 'title' => $l2->title . " (".(!!$l2->meta_title?$l2->meta_title."@":""). "url:" . $l2->url.")", + 'ordering' => $l2->ordering, + 'level3' => $_lev3, + 'checked' => [ + "is_create" => $lev2Access ? $lev2Access->is_create : 0, + "is_read" => $lev2Access ? $lev2Access->is_read : 0, + "is_update" => $lev2Access ? $lev2Access->is_update : 0, + "is_delete" => $lev2Access ? $lev2Access->is_delete : 0, + "is_download" => $lev2Access ? $lev2Access->is_download : 0, + ] + ]; + } + + $lev1Access = AccessMenu::where('ms_group_id', '=', $id)->where('ms_menu_id', '=', $l1->MsMenuId)->first(); + $_lev1[] = [ + 'id' => $l1->MsMenuId, + 'title' => $l1->title, + 'ordering' => $l1->ordering, + 'level2' => $_lev2, + 'checked' => [ + "is_create" => $lev1Access ? $lev1Access->is_create : 0, + "is_read" => $lev1Access ? $lev1Access->is_read : 0, + "is_update" => $lev1Access ? $lev1Access->is_update : 0, + "is_delete" => $lev1Access ? $lev1Access->is_delete : 0, + "is_download" => $lev1Access ? $lev1Access->is_download : 0, + ] + ]; + } + + $parentAccess = AccessMenu::where('ms_group_id', '=', $id)->where('ms_menu_id', '=', $row->MsMenuId)->first(); + $_parent[] = [ + 'id' => $row->MsMenuId, + 'title' => $row->title, + 'ordering' => $row->ordering, + 'level1' => $_lev1, + 'checked' => [ + "is_create" => $parentAccess ? $parentAccess->is_create : 0, + "is_read" => $parentAccess ? $parentAccess->is_read : 0, + "is_update" => $parentAccess ? $parentAccess->is_update : 0, + "is_delete" => $parentAccess ? $parentAccess->is_delete : 0, + "is_download" => $parentAccess ? $parentAccess->is_download : 0, + ] + ]; + + } + + return $_parent; + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $id) + { + // + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // + } +} diff --git a/app/Http/Controllers/Management/RoleController.php b/app/Http/Controllers/Management/RoleController.php new file mode 100644 index 0000000..de9ffbf --- /dev/null +++ b/app/Http/Controllers/Management/RoleController.php @@ -0,0 +1,174 @@ +route, 'module',true); + $data['breadcrumbs'] = [ + ['name' => 'Dashboard','url' => url('dashboard')], + ['name' => 'Management & Akses Role'], + ['name' => 'Data Role User','active' => true], + ]; + $data['title'] = $this->title; + $data['route'] = $this->route; + return view($this->template.'.index',$data); + } + + public function grid(Request $request) + { + + $data = Group::where('MsGroupId','!=',1)->orderBy('MsGroupId','DESC')->get(); + $_data = []; + + + foreach ($data as $key => $row) { + + + $action = ''; + + if((permission('is_create', $this->route.'.*','module',false)) || (permission('is_update', $this->route.'.*','module',false))){ + $action .= '
'; + $action .= ''; + $action .= ''; + // $action .= ''; + $action .= ''; + $action .= '
'; + } + + $_data[] = [ + 'no' => $key+1, + 'id' => encode_id($row->id), + 'name' => @$row->name, + 'action' => @$action, + ]; + + } + + // return response()->json($_data); // Return the data as a JSON response + return response()->json($_data); + + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + $data['breadcrumbs'] = [ + ['name' => 'Dashboard','url' => url('dashboard')], + ['name' => 'Management & Akses Role'], + ['name' => 'Data Role User','active' => true], + ]; + + $data['title'] = $this->title; + $data['route'] = $this->route; + return view($this->template.'.form',$data); + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + try { + + $keyId = decode_id($request->secure_id); + + Validator::make($request->all(), [ + 'name' => 'required', + 'alias' => 'required', + ])->validate(); + + if(@$keyId){ + $group = Group::find($keyId); + $group->name = $request->name; + $group->alias = $request->alias; + $group->save(); + }else{ + $group = new Group; + $group->name = $request->name; + $group->alias = $request->alias; + $group->created_by = auth()->user()->id; + $group->status = true; + $group->save(); + } + + return redirect()->back()->with([ + 'message' => 'Berhasil update data', + 'type' => 'success', + ]); + + }catch (Exception $e) { + return redirect()->back()->with([ + 'message' => $e->getMessage(), + 'type' => "error" + ]); + } + } + + /** + * Display the specified resource. + */ + public function show(string $id) + { + // + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(string $id) + { + // + } + + /** + * Update the specified resource in storage. + */ + public function update($id = null) + { + $data['breadcrumbs'] = [ + ['name' => 'Dashboard','url' => url('dashboard')], + ['name' => 'Management & Akses Role'], + ['name' => 'Data Role User','active' => true], + ]; + $keyId = decode_id($id); + $data['title'] = $this->title; + $data['route'] = $this->route; + $data['keyId'] = $id; + $data['item'] = Group::find($keyId); + return view($this->template.'.form',$data); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // + } + + public function delete($id) + { + $keyId = decode_id($id); + + $group = Group::where('MsGroupId',$keyId)->delete(); + + return response()->json(['success' => true,'message' => 'Berhasil update data','type' => 'success']); + } +} diff --git a/app/Http/Controllers/Management/UserController.php b/app/Http/Controllers/Management/UserController.php new file mode 100644 index 0000000..4b3ea4b --- /dev/null +++ b/app/Http/Controllers/Management/UserController.php @@ -0,0 +1,245 @@ +route, 'module',true); + + $data['breadcrumbs'] = [ + ['name' => 'Dashboard','url' => url('dashboard')], + ['name' => 'Management & Akses Role'], + ['name' => 'Data User','active' => true], + ]; + $data['title'] = $this->title; + $data['route'] = $this->route; + return view($this->template.'.index',$data); + } + + public function grid(Request $request) + { + + $data = User::with(['group'])->where('ms_group_id','!=',1)->where('id','!=',auth()->user()->id)->orderBy('id','DESC')->get(); + // $data = User::with(['group'])->orderBy('id','DESC')->get(); + $_data = []; + + + foreach ($data as $key => $row) { + + + $action = ''; + + if((permission('is_create', $this->route.'.*','module',false)) || (permission('is_update', $this->route.'.*','module',false))){ + $action .= '
'; + $action .= ''; + if(session('group_id') == 1){ + $action .= ''; + $action .= ''; + } + $action .= '
'; + } + + $_data[] = [ + 'no' => $key+1, + 'id' => encode_id($row->id), + 'name' => @$row->name, + 'role' => @$row->group->name, + 'username' => @$row->username, + 'email' => @$row->email, + 'created_at' => dateTime(@$row->created_at), + 'action' => @$action, + ]; + + } + + // return response()->json($_data); // Return the data as a JSON response + return response()->json($_data); + + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + try { + + $keyId = decode_id($request->secure_id); + + if(@$keyId){ + Validator::make($request->all(), [ + 'email' => 'required|unique:users,email,'.$keyId.'|email', + 'name' => 'required|max:50', + 'group' => 'required', + 'username' => 'required|unique:users,username,'.$keyId, + 'password' => 'nullable|min:8|max:15|regex:/[a-z]/|regex:/[A-Z]/|regex:/[0-9]/|regex:/[@$!%*#?&]/', //min 8 char, maks 15 char, min 1 symbol, min 1 uppercase, min 1 lowercase, 1 number + ],[ + 'password.min' => 'password Minimal 8 Karakter', + 'password.max' => 'password Maksimal 15 Karakter', + 'password.regex' => 'Format Kata Sandi harus mengandung minimal Huruf Besar, Huruf Kecil, Angka, Spesial Karakter', + ])->validate(); + + $user = User::find($keyId); + $user->email = $request->email; + $user->username = $request->username; + $user->ms_group_id = decode_id($request->group); + if(@$request->password){ + $user->password = Hash::make($request->password); + } + $user->name = $request->name; + $user->save(); + }else{ + Validator::make($request->all(), [ + 'email' => 'required|unique:users,email|email', + 'name' => 'required|max:50', + 'group' => 'required', + 'username' => 'required|unique:users,username', + 'password' => 'required|min:8|max:15|regex:/[a-z]/|regex:/[A-Z]/|regex:/[0-9]/|regex:/[@$!%*#?&]/', //min 8 char, maks 15 char, min 1 symbol, min 1 uppercase, min 1 lowercase, 1 number + ],[ + 'password.min' => 'password Minimal 8 Karakter', + 'password.max' => 'password Maksimal 15 Karakter', + 'password.regex' => 'Format Kata Sandi harus mengandung minimal Huruf Besar, Huruf Kecil, Angka, Spesial Karakter', + ])->validate(); + + $user = new User; + $user->email = $request->email; + $user->username = $request->username; + $user->ms_group_id = decode_id($request->group); + if(@$request->password){ + $user->password = Hash::make($request->password); + } + $user->name = $request->name; + $user->save(); + } + + return redirect()->back()->with([ + 'message' => 'Berhasil update data', + 'type' => 'success', + ]); + + } catch (Exception $e) { + return redirect()->back()->with([ + 'message' => $e->getMessage(), + 'type' => "error" + ]); + } + } + + /** + * Display the specified resource. + */ + public function show(string $id) + { + // + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(string $id) + { + // + } + + /** + * Update the specified resource in storage. + */ + public function update($id = null) + { + $data['breadcrumbs'] = [ + ['name' => 'Dashboard','url' => url('dashboard')], + ['name' => 'Management & Akses Role'], + ['name' => 'Data User','active' => true], + ]; + $keyId = decode_id($id); + $data['title'] = $this->title; + $data['route'] = $this->route; + $data['keyId'] = $id; + $data['item'] = User::where('id',$keyId)->first(); + $data['group'] = Group::where('MsGroupId','!=',1)->get(); + return view($this->template.'.form',$data); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // + } + + public function delete($id) + { + $keyId = decode_id($id); + + $user = User::where('id',$keyId)->delete(); + + return response()->json(['success' => true,'message' => 'Berhasil update data','type' => 'success']); + } + + public function forcelogin($id = null) + { + + //dd($id); + + if (!$id) { + return response()->json(['success' => false,'message' => 'Data Tidak Temukan','type' => 'error']); + } + + $id = decode_id($id); + $user = User::find($id); + if (!$user) { + return response()->json(['success' => false,'message' => 'Data Tidak Temukan','type' => 'error']); + } else { + + if ($user->username && $user->password) { + if (Auth::loginUsingId($id)) { + $session = [ + 'username' => $user->username, + 'name' => $user->name, + 'email' => $user->email, + 'currYear' => date('Y'), + 'group_id' => @$user->ms_group_id, + 'group_alias' => @$user->group->alias, + 'group_name' => @$user->group->name, + ]; + session($session); + + return response()->json(['status' => true,'message' => 'Selamat datang kembali','type' => 'success']); + } + else { + + return response()->json(['status' => false,'message' => 'Maaf Terjadi Kesalahan','type' => 'error']); + } + } else { + return response()->json(['status' => false,'message' => 'Maaf Terjadi Kesalahan','type' => 'error']); + } + } + } +} diff --git a/app/Http/Controllers/ManagementUserController.php b/app/Http/Controllers/ManagementUserController.php new file mode 100644 index 0000000..3a00c0a --- /dev/null +++ b/app/Http/Controllers/ManagementUserController.php @@ -0,0 +1,64 @@ +with([ + 'message' => 'Maaf anda harus login terlebih dahulu', + 'type' => "error" + ]); + } + return $next($request); + } +} diff --git a/app/Models/Group.php b/app/Models/Group.php deleted file mode 100644 index cf9a09a..0000000 --- a/app/Models/Group.php +++ /dev/null @@ -1,10 +0,0 @@ -belongsTo('App\Models\User','id','user_id'); + } +} diff --git a/app/Models/Master/Group.php b/app/Models/Master/Group.php new file mode 100644 index 0000000..4ea7c18 --- /dev/null +++ b/app/Models/Master/Group.php @@ -0,0 +1,12 @@ +hasMany(Menu::class,'parent_id','id'); + } + + public static function coreMenus($type, array $status = [1]): mixed + { + return Menu::where('parent_id', '=', 0) + ->where('menu_type', '=', $type) + ->whereIn('status', $status); + } + + public static function coreMenusByParent($id, array $status = [1]): mixed + { + return Menu::where('parent_id', '=', $id) + ->whereIn('status', $status); + } + + public static function getMenuByParentPosition($id, $type, array $active = [1], int $year = null): mixed + { + if ($year) { + $currYear = $year; + } else { + $currYear = date('Y'); + } + + return Menu::where('parent_id', '=', $id) + ->where('menu_type', '=', $type) + ->whereIn('status', $active) + ->union(Menu::coreMenus($type, $active)) + ->orderBy('ordering') + ->get(); + } + + /** + * @author alex.gz + * @created 08/12/2023 12:53 + * + * @param $type + * @param int|null $year + * + * @return mixed + */ + public static function getParentByType($type, int $year = null): mixed + { + if ($year) { + $currYear = $year; + } else { + $currYear = date('Y'); + } + + return Menu::where('parent_id', '=', 0) + ->where('menu_type', '=', $type) + ->union(Menu::coreMenus($type)) + ->orderBy('ordering') + ->get(); + } + + /** + * @author alex.gz + * @created 08/12/2023 18:07 + * + * @param $type + * @param int|null $year + * + * @return mixed + */ + public static function getMenuByYear($type, int $year = null): mixed + { + if ($year) { + $currYear = $year; + } else { + $currYear = date('Y'); + } + + return Menu::where('parent_id', '=', 0) + ->where('menu_type', '=', $type) + ->where('status', '=', true) + ->orderBy('ordering') + ->get(); + } + + /** + * @author alex.gz + * @created 08/12/2023 12:54 + * + * @param $type + * @param int|null $year + * + * @return mixed + */ + public static function getParentByTypeStatus($type, int $year = null): mixed + { + if ($year) { + $currYear = $year; + } else { + $currYear = date('Y'); + } + + return Menu::where('parent_id', '=', 0) + ->where('menu_type', '=', $type) + ->where('status', '=', true) + ->union(Menu::coreMenus($type)) + ->orderBy('ordering') + ->get(); + } + + /** + * @author alex.gz + * @created 08/12/2023 12:54 + * + * @param $id + * @param array $active + * @param int|null $year + * + * @return mixed + */ + public static function getMenuByParent($id, array $active = [1], int $year = null): mixed + { + if ($year) { + $currYear = $year; + } else { + $currYear = date('Y'); + } + + return Menu::where('parent_id', '=', $id) + ->union(Menu::coreMenusByParent($id, $active)) + ->whereIn('status', $active) + ->orderBy('ordering') + ->get(); + } + + /** + * @author alex.gz + * @created 08/12/2023 14:54 + * + * @param int $year + * + * @return mixed + */ + public static function countMenuByYear(int $year): mixed + { + $model = Menu::where('status', '=', true); + return $model->count(); + } + + /** + * @author alex.gz + * @created 08/12/2023 12:55 + * + * @param $id + * @param int|null $year + * + * @return mixed + */ + public static function getActiveById($id, int $year = null): mixed + { + if ($year) { + $currYear = $year; + } else { + $currYear = date('Y'); + } + + return Menu::where('id', '=', $id) + ->where('status', '=', true) + ->first(); + } + + /** + * @author alex.gz + * @created 08/12/2023 12:55 + * + * @param $type + * @param int|null $year + * + * @return mixed + */ + public static function getActiveByPosition($type, int $year = null): mixed + { + if ($year) { + $currYear = $year; + } else { + $currYear = date('Y'); + } + + return Menu::where('menu_type', '=', $type) + ->where('status', '=', true) + ->union(Menu::coreMenus($type)) + ->orderBy('ordering') + ->get(); + } +} diff --git a/app/Models/Master/MenuAccess.php b/app/Models/Master/MenuAccess.php new file mode 100644 index 0000000..9dd6545 --- /dev/null +++ b/app/Models/Master/MenuAccess.php @@ -0,0 +1,12 @@ +id('MsMenuId'); + $table->foreignId('parent_id')->index()->default(0)->comment('idx menu_id'); + $table->string('title', 150); + $table->string('module', 150)->nullable(); + $table->string('url', 150)->nullable(); + $table->string('menu_type', 50)->index()->nullable()->comment('tb_menu_group alias'); + $table->string('menu_icons', 50)->nullable(); + $table->tinyInteger('ordering')->default(0); + $table->boolean('status')->default(true)->comment('True/False'); + $table->foreignId('created_by')->default(0); + $table->foreignId('updated_by')->default(0)->nullable(); + $table->timestamps(); + $table->comment('Master menu aplikasi'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('ms_menu'); + } +}; diff --git a/database/migrations/2025_05_21_035347_create_table_ms_group.php b/database/migrations/2025_05_21_035347_create_table_ms_group.php new file mode 100644 index 0000000..96064e3 --- /dev/null +++ b/database/migrations/2025_05_21_035347_create_table_ms_group.php @@ -0,0 +1,32 @@ +id('MsGroupId'); + $table->string('name', 50)->unique(); + $table->string('alias', 50)->unique(); + $table->boolean('status')->default(true)->comment('True/False'); + $table->foreignId('created_by')->default(0); + $table->foreignId('updated_by')->default(0)->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('ms_group'); + } +}; diff --git a/database/migrations/2025_05_21_035406_create_table_ms_access_menu.php b/database/migrations/2025_05_21_035406_create_table_ms_access_menu.php new file mode 100644 index 0000000..4fe7c51 --- /dev/null +++ b/database/migrations/2025_05_21_035406_create_table_ms_access_menu.php @@ -0,0 +1,42 @@ +id('MsAccessMenuId'); + $table->foreignId('ms_group_id')->comment('FK ms group'); + $table->string('module', 150)->nullable(); + $table->foreignId('ms_menu_id')->comment('FK tb_menu'); + $table->string('menu_group', 20)->nullable()->default('adminsidebar'); + $table->boolean('is_create')->default(false); + $table->boolean('is_read')->default(false); + $table->boolean('is_update')->default(false); + $table->boolean('is_delete')->default(false); + $table->boolean('is_verify')->default(false); + $table->boolean('is_approve')->default(false); + $table->boolean('is_download')->default(false); + $table->json('access')->nullable(); + $table->timestamps(); + $table->foreign('ms_menu_id')->references('MsMenuId')->on('ms_menu')->cascadeOnDelete(); + $table->foreign('ms_group_id')->references('MsGroupId')->on('ms_group')->cascadeOnDelete(); + $table->comment('Master hak akses role/group user'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('ms_access_menu'); + } +}; diff --git a/database/migrations/2025_05_21_035435_add_foreignkey_tbl_user.php b/database/migrations/2025_05_21_035435_add_foreignkey_tbl_user.php new file mode 100644 index 0000000..6e5230c --- /dev/null +++ b/database/migrations/2025_05_21_035435_add_foreignkey_tbl_user.php @@ -0,0 +1,29 @@ +integer('ms_group_id')->after('id'); + $table->foreign('ms_group_id')->references('MsGroupId')->on('ms_group')->cascade(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + // + }); + } +}; diff --git a/database/migrations/2025_05_21_035450_create_table_log.php b/database/migrations/2025_05_21_035450_create_table_log.php new file mode 100644 index 0000000..0bc695c --- /dev/null +++ b/database/migrations/2025_05_21_035450_create_table_log.php @@ -0,0 +1,35 @@ +bigIncrements('MsLogId'); + $table->string('module',200)->nullable(); + $table->string('task',100)->nullable(); + $table->unsignedBigInteger('user_id')->index()->nullable(); + $table->ipAddress('ipaddress')->nullable(); + $table->mediumText('useragent')->nullable(); + $table->mediumText('note')->nullable(); + $table->timestamps(); + + $table->foreign('user_id')->references('id')->on('users')->cascadeOnDelete(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('ms_log'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index d01a0ef..8c8ef54 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -2,9 +2,11 @@ namespace Database\Seeders; -use App\Models\User; // use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; +use Hash; +use App\Models\Master\Group; +use App\Models\User; class DatabaseSeeder extends Seeder { @@ -13,11 +15,32 @@ class DatabaseSeeder extends Seeder */ public function run(): void { - // User::factory(10)->create(); + $group = [ + ['name' => 'Administrator','alias' => 'administrator'], + ['name' => 'Dinas','alias' => 'dinas'], + ]; - User::factory()->create([ - 'name' => 'Test User', - 'email' => 'test@example.com', + foreach($group as $valGroup){ + Group::updateOrCreate([ + 'name' => $valGroup['name'], + 'alias' => $valGroup['alias'], + ],[ + 'name' => $valGroup['name'], + 'alias' => $valGroup['alias'], + 'status' => 1, + ]); + } + + User::updateOrCreate([ + 'name' => 'Administrator', + // 'username' => 'administrator', + 'email' => 'adminproklim@dlh.go.id', + ],[ + 'name' => 'Administrator', + // 'username' => 'administrator', + 'email' => 'adminproklim@dlh.go.id', + 'ms_group_id' => '1', + 'password' => Hash::make('##proklim2025'), ]); } } diff --git a/package.json b/package.json index e32a862..575138f 100644 --- a/package.json +++ b/package.json @@ -6,11 +6,14 @@ "dev": "vite" }, "devDependencies": { + "@popperjs/core": "^2.11.6", "autoprefixer": "^10.4.20", "axios": "^1.7.4", + "bootstrap": "^5.2.3", "concurrently": "^9.0.1", "laravel-vite-plugin": "^1.2.0", "postcss": "^8.4.47", + "sass": "^1.56.1", "tailwindcss": "^3.4.13", "vite": "^6.0.11" } diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js index 5f1390b..46f7a33 100644 --- a/resources/js/bootstrap.js +++ b/resources/js/bootstrap.js @@ -1,4 +1,34 @@ +import 'bootstrap'; + +/** + * We'll load the axios HTTP library which allows us to easily issue requests + * to our Laravel back-end. This library automatically handles sending the + * CSRF token as a header based on the value of the "XSRF" token cookie. + */ + import axios from 'axios'; window.axios = axios; window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; + +/** + * Echo exposes an expressive API for subscribing to channels and listening + * for events that are broadcast by Laravel. Echo and event broadcasting + * allows your team to easily build robust real-time web applications. + */ + +// import Echo from 'laravel-echo'; + +// import Pusher from 'pusher-js'; +// window.Pusher = Pusher; + +// window.Echo = new Echo({ +// broadcaster: 'pusher', +// key: import.meta.env.VITE_PUSHER_APP_KEY, +// cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER ?? 'mt1', +// wsHost: import.meta.env.VITE_PUSHER_HOST ?? `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`, +// wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80, +// wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443, +// forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https', +// enabledTransports: ['ws', 'wss'], +// }); diff --git a/resources/sass/_variables.scss b/resources/sass/_variables.scss new file mode 100644 index 0000000..172daaa --- /dev/null +++ b/resources/sass/_variables.scss @@ -0,0 +1,7 @@ +// Body +$body-bg: #f8fafc; + +// Typography +$font-family-sans-serif: 'Nunito', sans-serif; +$font-size-base: 0.9rem; +$line-height-base: 1.6; diff --git a/resources/sass/app.scss b/resources/sass/app.scss new file mode 100644 index 0000000..1026a0b --- /dev/null +++ b/resources/sass/app.scss @@ -0,0 +1,8 @@ +// Fonts +@import url('https://fonts.bunny.net/css?family=Nunito'); + +// Variables +@import 'variables'; + +// Bootstrap +@import 'bootstrap/scss/bootstrap'; diff --git a/resources/views/admin/layout-admin/sidebar.blade.php b/resources/views/admin/layout-admin/sidebar.blade.php index 1241835..522b5d4 100644 --- a/resources/views/admin/layout-admin/sidebar.blade.php +++ b/resources/views/admin/layout-admin/sidebar.blade.php @@ -1,27 +1,17 @@ - - - - diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php new file mode 100644 index 0000000..c2b6827 --- /dev/null +++ b/resources/views/auth/login.blade.php @@ -0,0 +1,59 @@ + + + + Proklim - Dinas Lingkungan Hidup + + + + + + + +
+
+
+ Rocket logo +

Dinas Lingkungan Hidup

+

Kampung Proklim

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam scelerisque aliquam odio et faucibus. +

+
+
+
+
+

+ Masuk +

+
+ {{ csrf_field() }} +
+ + +
+
+ + +
+
+ + + Daftar + +
+
+
+
+
+ + diff --git a/resources/views/auth/passwords/confirm.blade.php b/resources/views/auth/passwords/confirm.blade.php new file mode 100644 index 0000000..f8c8e61 --- /dev/null +++ b/resources/views/auth/passwords/confirm.blade.php @@ -0,0 +1,49 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
{{ __('Confirm Password') }}
+ +
+ {{ __('Please confirm your password before continuing.') }} + +
+ @csrf + +
+ + +
+ + + @error('password') + + {{ $message }} + + @enderror +
+
+ +
+
+ + + @if (Route::has('password.request')) + + {{ __('Forgot Your Password?') }} + + @endif +
+
+
+
+
+
+
+
+@endsection diff --git a/resources/views/auth/passwords/email.blade.php b/resources/views/auth/passwords/email.blade.php new file mode 100644 index 0000000..d1ac783 --- /dev/null +++ b/resources/views/auth/passwords/email.blade.php @@ -0,0 +1,47 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
{{ __('Reset Password') }}
+ +
+ @if (session('status')) + + @endif + +
+ @csrf + +
+ + +
+ + + @error('email') + + {{ $message }} + + @enderror +
+
+ +
+
+ +
+
+
+
+
+
+
+
+@endsection diff --git a/resources/views/auth/passwords/reset.blade.php b/resources/views/auth/passwords/reset.blade.php new file mode 100644 index 0000000..dccf6c6 --- /dev/null +++ b/resources/views/auth/passwords/reset.blade.php @@ -0,0 +1,65 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
{{ __('Reset Password') }}
+ +
+
+ @csrf + + + +
+ + +
+ + + @error('email') + + {{ $message }} + + @enderror +
+
+ +
+ + +
+ + + @error('password') + + {{ $message }} + + @enderror +
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+@endsection diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php new file mode 100644 index 0000000..0f3043b --- /dev/null +++ b/resources/views/auth/register.blade.php @@ -0,0 +1,86 @@ + + + + Spacer - Create Your Account + + + + + + + +
+
+
+

+ Welcome to +

+ Rocket logo +

+ Spacer +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam scelerisque aliquam odio et faucibus. +

+ +
+
+
+
+

+ Create your account +

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+ + diff --git a/resources/views/auth/verify.blade.php b/resources/views/auth/verify.blade.php new file mode 100644 index 0000000..9f8c1bc --- /dev/null +++ b/resources/views/auth/verify.blade.php @@ -0,0 +1,28 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
{{ __('Verify Your Email Address') }}
+ +
+ @if (session('resent')) + + @endif + + {{ __('Before proceeding, please check your email for a verification link.') }} + {{ __('If you did not receive the email') }}, +
+ @csrf + . +
+
+
+
+
+
+@endsection diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php index 731e5c1..8cc31e4 100644 --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -1,4 +1,4 @@ -@extends('layout.master') +@extends('layouts.master') @section('content')
diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php new file mode 100644 index 0000000..1f34466 --- /dev/null +++ b/resources/views/home.blade.php @@ -0,0 +1,23 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
{{ __('Dashboard') }}
+ +
+ @if (session('status')) + + @endif + + {{ __('You are logged in!') }} +
+
+
+
+
+@endsection diff --git a/resources/views/include/sidebar.blade.php b/resources/views/include/sidebar.blade.php index 052cdc4..c42cd37 100644 --- a/resources/views/include/sidebar.blade.php +++ b/resources/views/include/sidebar.blade.php @@ -4,21 +4,15 @@ -
- - - -
-
- -
-
- -
- -
- -
-
- -
-
- - diff --git a/resources/views/layout/head.blade.php b/resources/views/layout/head.blade.php deleted file mode 100644 index ce8715b..0000000 --- a/resources/views/layout/head.blade.php +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - Program Kampung Iklim - - - - - - - - - - - - - - \ No newline at end of file diff --git a/resources/views/layout/master.blade.php b/resources/views/layout/master.blade.php deleted file mode 100644 index 16a8b67..0000000 --- a/resources/views/layout/master.blade.php +++ /dev/null @@ -1,805 +0,0 @@ - - - - - - - Analytics | Velzon - Admin & Dashboard Template - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - @include('include.header') - - - - @include('include.sidebar') - -
- - - - -
- -
- @yield('content') - -
- - -
-
-
-
- © Velzon. -
-
-
- Design & Develop by Themesbrand -
-
-
-
-
-
- - -
- - - - - - - - - -
-
-
- Loading... -
-
-
- -
-
- -
-
- - -
-
-
Theme Customizer
- - -
-
-
-
-
Layout
-

Choose your layout

- -
-
-
- - -
-
Vertical
-
-
-
- - -
-
Horizontal
-
-
-
- - -
-
Two Column
-
- -
- -
Color Scheme
-

Choose Light or Dark Scheme.

- -
-
-
-
- - -
-
Light
-
- -
-
- - -
-
Dark
-
-
-
- -
-
Layout Width
-

Choose Fluid or Boxed layout.

- -
-
-
- - -
-
Fluid
-
-
-
- - -
-
Boxed
-
-
-
- -
-
Layout Position
-

Choose Fixed or Scrollable Layout Position.

- -
- - - - - -
-
-
Topbar Color
-

Choose Light or Dark Topbar Color.

- -
-
-
- - -
-
Light
-
-
-
- - -
-
Dark
-
-
- - - - - - - - -
-
Preloader
-

Choose a preloader.

- -
-
- -
Enable
-
-
- -
Disable
-
-
- -
- - -
-
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/resources/views/layout/navbar.blade.php b/resources/views/layout/navbar.blade.php deleted file mode 100644 index 3a0ee4a..0000000 --- a/resources/views/layout/navbar.blade.php +++ /dev/null @@ -1,35 +0,0 @@ - - -
- - @stack('style') -
- \ No newline at end of file diff --git a/resources/views/layout/script.blade.php b/resources/views/layout/script.blade.php deleted file mode 100644 index 70a649a..0000000 --- a/resources/views/layout/script.blade.php +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - -@stack('script') \ No newline at end of file diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php new file mode 100644 index 0000000..a6970da --- /dev/null +++ b/resources/views/layouts/app.blade.php @@ -0,0 +1,80 @@ + + + + + + + + + + {{ config('app.name', 'Laravel') }} + + + + + + + @vite(['resources/sass/app.scss', 'resources/js/app.js']) + + +
+ + +
+ @yield('content') +
+
+ + diff --git a/resources/views/layouts/master.blade.php b/resources/views/layouts/master.blade.php new file mode 100644 index 0000000..e4a872d --- /dev/null +++ b/resources/views/layouts/master.blade.php @@ -0,0 +1,96 @@ + + + + + + + {{@$title}} - Proklim Dinas Lingkungan Hidup + + + + + + + + + + + + + + + + + + + + @yield('css') + + + + + + +
+ + @include('include.header') + + @include('include.sidebar') + +
+ + + + +
+ +
+ @yield('content') + +
+ + +
+
+
+
+ © Velzon. +
+
+
+ Copyright by Dinas Lingkungan Hidup Provinsi DKI Jakarta +
+
+
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + @yield('jss') + + + \ No newline at end of file diff --git a/resources/views/modules/management/role/akses/form.blade.php b/resources/views/modules/management/role/akses/form.blade.php new file mode 100644 index 0000000..75f5217 --- /dev/null +++ b/resources/views/modules/management/role/akses/form.blade.php @@ -0,0 +1,275 @@ +@extends('layouts.master') +@section('content') +
+
+
+
+

Data {{$title}}

+
+
+
+ {{csrf_field()}} +
+ + + + + + + + + + + + + + @foreach($menu as $key1 => $parent) + + + + + + + + + + + @if($parent['level1']) + @foreach($parent['level1'] as $key2 => $level1) + + + + + + + + + + + + @if($level1['level2']) + @foreach($level1['level2'] as $key3 => $level2) + + + + + + + + + + @if($level2['level3']) + @foreach($level2['level3'] as $key4 => $level3) + + + + + + + + + + @if($level3['level4']) + @foreach($level3['level4'] as $key5 => $level4) + + + + + + + + + + @endforeach + @endif + @endforeach + @endif + @endforeach + @endif + @endforeach + @endif + @endforeach + +
#Menu
+ @if(count($parent['level1']) > 0) + + + + @endif + {{$parent['title']}} + + + + + + + + + +
+ @if(count($level1['level2']) > 0)@endif + --- {{$level1['title']}} + + + + + + + + + +
+ @if(count($level2['level3']) > 0)@endif + ------ {{$level2['title']}} + + + + + + + + + +
+ @if(count($level3['level4']) > 0)@endif + --------- {{$level3['title']}} + + + + + + + + + +
+ {{$level4['id']}} + ------------ {{$level4['title']}} + + + + + + + + + +
+ +
+
+ Batal + +
+
+
+
+@endsection +@section('js') + +@endsection \ No newline at end of file diff --git a/resources/views/modules/management/role/form.blade.php b/resources/views/modules/management/role/form.blade.php new file mode 100644 index 0000000..39e0f34 --- /dev/null +++ b/resources/views/modules/management/role/form.blade.php @@ -0,0 +1,35 @@ +@extends('layouts.master') +@section('content') +
+
+

Data {{$title}}

+
+
+ {{csrf_field()}} + +
+
+
+ + + @error('name') + {{$message}} + @enderror +
+
+ + + Pastikan mengandung huruf kecil semua dan tidak ada "spasi" atau tanda baca "-" + @error('alias') + {{$message}} + @enderror +
+
+
+
+  Batal + +
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/modules/management/role/index.blade.php b/resources/views/modules/management/role/index.blade.php new file mode 100644 index 0000000..7eaa072 --- /dev/null +++ b/resources/views/modules/management/role/index.blade.php @@ -0,0 +1,85 @@ +@extends('layouts.master') + +@section('css') +@endsection +@section('content') +
+
+
+
+

Data {{$title}}

+
+
+
+ + + + + + + + + + +
#NoName
+
+
+
+ +@endsection +@section('js') + +@endsection \ No newline at end of file diff --git a/resources/views/modules/management/user/form.blade.php b/resources/views/modules/management/user/form.blade.php new file mode 100644 index 0000000..ddfd0b3 --- /dev/null +++ b/resources/views/modules/management/user/form.blade.php @@ -0,0 +1,92 @@ +@extends('layouts.master') +@section('content') +
+
+
+
+

Data {{$title}}

+
+
+
+ {{csrf_field()}} + +
+
+
+ + + @error('username') + {{$message}} + @enderror +
+
+ + + @error('name') + {{$message}} + @enderror +
+
+ + + @error('name') + {{$message}} + @enderror +
+
+ + + @error('group') + {{$message}} + @enderror +
+
+
+
+ + + @error('password') + {{$message}} + @enderror + +

+ Kata Sandi harus mengandung Minimal 8 karakter, maksimal 15 karakter,
setidaknya 1 huruf kecil dan huruf besar, angka dan simbol +

+
+
+
+
+  Batal + +
+
+
+
+@endsection +@section('page-js') + +@endsection \ No newline at end of file diff --git a/resources/views/modules/management/user/index.blade.php b/resources/views/modules/management/user/index.blade.php new file mode 100644 index 0000000..b87d1a5 --- /dev/null +++ b/resources/views/modules/management/user/index.blade.php @@ -0,0 +1,128 @@ +@extends('layouts.master') + +@section('css') +@endsection +@section('content') +
+
+
+
+

Data {{$title}}

+
+
+
+ + + + + + + + + + + + +
#NoRoleEmailNameCreated At
+
+
+
+ +@endsection +@section('js') + +@endsection \ No newline at end of file diff --git a/routes/modules/modules.php b/routes/modules/modules.php new file mode 100644 index 0000000..0b0a2fe --- /dev/null +++ b/routes/modules/modules.php @@ -0,0 +1,32 @@ +name('dashboard'); + +Route::name('management.')->prefix('management')->group(function () { + Route::name('user.')->prefix('user')->group(function () { + Route::resource('/',UserController::class); + Route::get('grid',[UserController::class,'grid'])->name('grid'); + Route::get('update/{id?}',[UserController::class,'update'])->name('update'); + Route::get('delete/{id?}',[UserController::class,'delete'])->name('delete'); + Route::get('forcelogin/{id?}',[UserController::class,'forcelogin'])->name('forcelogin'); + }); + + Route::name('role.')->prefix('role')->group(function () { + Route::resource('/',RoleController::class); + Route::get('grid',[RoleController::class,'grid'])->name('grid'); + Route::get('update/{id?}',[RoleController::class,'update'])->name('update'); + Route::get('delete/{id?}',[RoleController::class,'delete'])->name('delete'); + + Route::name('akses.')->prefix('akses')->group(function () { + Route::resource('/',AksesController::class); + Route::get('{id}/edit',[AksesController::class,'edit'])->name('edit'); + }); + }); +}); \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index eda9c5b..0bba1fc 100644 --- a/routes/web.php +++ b/routes/web.php @@ -2,23 +2,42 @@ use Illuminate\Support\Facades\Route; + use App\Http\Controllers\HomeController; +use App\Http\Middleware\Session; +use App\Http\Controllers\Auth\CustomLoginController; +use App\Http\Controllers\Auth\CustomRegisterController; Route::get('/', function () { return view('welcome'); }); -Route::get('/home2', function () { return view('home2'); }); -Route::get('/halaman_login', [HomeController::class, 'login'])->name('login.login'); -Route::get('/halaman_register', [HomeController::class, 'register'])->name('login.register'); -Route::get('/home', [HomeController::class, 'home'])->name('landing-page.home'); -Route::get('/dashboard-admin', [HomeController::class, 'dashboard'])->name('admin.dashboard-admin.dashboard'); -Route::get('/admin', [HomeController::class, 'admin'])->name('admin.admin'); -Route::get('/profile', [HomeController::class, 'profile'])->name('admin.profile.profile'); -Route::get('/identitas_lokasi', [HomeController::class, 'identitas_lokasi'])->name('admin.identitas_lokasi.identitas_lokasi'); -Route::get('/data_dasar', [HomeController::class, 'data_dasar'])->name('admin.data_dasar.data_dasar'); -Route::get('/informasi_perubahan', [HomeController::class, 'informasi_perubahan'])->name('admin.informasi_perubahan.informasi_perubahan'); -Route::get('/adaptasi_perubahan', [HomeController::class, 'adaptasi_perubahan'])->name('admin.adaptasi_perubahan.adaptasi_perubahan'); -Route::get('/mitigasi_perubahan', [HomeController::class, 'mitigasi_perubahan'])->name('admin.mitigasi.mitigasi_perubahan'); -Route::get('/kelembagaan_masyarakat', [HomeController::class, 'kelembagaan_masyarakat'])->name('admin.kelembagaan_masyarakat.kelembagaan_masyarakat'); -Route::get('/dashboard-admin2', [HomeController::class, 'dashboard2'])->name('admin.dashboard-admin.dashboard2'); -// Route::get('/verifikasi_final', [HomeController::class, 'verifikasi_final'])->name('admin.verifikasi_final.verifikasi_final'); \ No newline at end of file +Route::get('/login', [CustomLoginController::class,'index'])->name('login.login'); +Route::post('login',[CustomLoginController::class,'post_login'])->name('post_login'); +Route::get('register',[CustomRegisterController::class,'index'])->name('login.register'); +Route::post('register',[CustomRegisterController::class,'post_register'])->name('post_register'); + +Route::middleware(Session::class)->name('modules.')->group(function () { + + include_route_files(__DIR__ . '/modules'); + + Route::get('logout',[CustomLoginController::class,'logout'])->name('logout'); +}); + +// Route::get('/home2', function () { return view('home2'); }); +// Route::get('/halaman_login', [HomeController::class, 'login'])->name('login.login'); +// Route::get('/halaman_register', [HomeController::class, 'register'])->name('login.register'); +// Route::get('/home', [HomeController::class, 'home'])->name('landing-page.home'); +// Route::get('/dashboard-admin', [HomeController::class, 'dashboard'])->name('admin.dashboard-admin.dashboard'); +// Route::get('/admin', [HomeController::class, 'admin'])->name('admin.admin'); +// Route::get('/profile', [HomeController::class, 'profile'])->name('admin.profile.profile'); +// Route::get('/identitas_lokasi', [HomeController::class, 'identitas_lokasi'])->name('admin.identitas_lokasi.identitas_lokasi'); +// Route::get('/data_dasar', [HomeController::class, 'data_dasar'])->name('admin.data_dasar.data_dasar'); +// Route::get('/informasi_perubahan', [HomeController::class, 'informasi_perubahan'])->name('admin.informasi_perubahan.informasi_perubahan'); +// Route::get('/adaptasi_perubahan', [HomeController::class, 'adaptasi_perubahan'])->name('admin.adaptasi_perubahan.adaptasi_perubahan'); +// Route::get('/mitigasi_perubahan', [HomeController::class, 'mitigasi_perubahan'])->name('admin.mitigasi.mitigasi_perubahan'); +// Route::get('/kelembagaan_masyarakat', [HomeController::class, 'kelembagaan_masyarakat'])->name('admin.kelembagaan_masyarakat.kelembagaan_masyarakat'); +// Route::get('/dashboard-admin2', [HomeController::class, 'dashboard2'])->name('admin.dashboard-admin.dashboard2'); + +// Route::get('/verifikasi_final', [HomeController::class, 'verifikasi_final'])->name('admin.verifikasi_final.verifikasi_final'); +// Auth::routes(); +// Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); diff --git a/vite.config.js b/vite.config.js index 421b569..dbbf333 100644 --- a/vite.config.js +++ b/vite.config.js @@ -4,7 +4,10 @@ import laravel from 'laravel-vite-plugin'; export default defineConfig({ plugins: [ laravel({ - input: ['resources/css/app.css', 'resources/js/app.js'], + input: [ + 'resources/sass/app.scss', + 'resources/js/app.js', + ], refresh: true, }), ],