main
ilhamwara 2025-06-23 10:08:28 +07:00
parent 934f8cd554
commit ada0c442b9
10 changed files with 308 additions and 17 deletions

View File

@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Master\Instansi;
class AjaxController extends Controller
{
function getInstansi($type){
$data = [];
$instansi = Instansi::where('parent',$type)->get();
foreach ($instansi as $key => $value) {
$data[$key]['id'] = encode_id($value->MsInstansiId);
$data[$key]['name'] = $value->name;
}
return response()->json(['data' => $data,'status' => true]);
}
}

View File

@ -42,6 +42,7 @@ class CustomLoginController extends Controller
'email' => $user->email,
'currYear' => date('Y'),
'group_id' => @$user->ms_group_id,
'instansi_id' => @$user->ms_instansi_id,
'group_alias' => @$user->group->alias,
'group_name' => @$user->group->name,
];
@ -70,6 +71,7 @@ class CustomLoginController extends Controller
'email' => $user->email,
'currYear' => date('Y'),
'group_id' => @$user->ms_group_id,
'instansi_id' => @$user->ms_instansi_id,
'group_alias' => @$user->group->alias,
'group_name' => @$user->group->name,
];

View File

@ -97,6 +97,7 @@ class UserController extends Controller
'email' => 'required|unique:users,email,'.$keyId.'|email',
'name' => 'required|max:50',
'group' => 'required',
'ms_instansi_id' => '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
],[
@ -109,6 +110,7 @@ class UserController extends Controller
$user->email = $request->email;
$user->username = $request->username;
$user->ms_group_id = decode_id($request->group);
$user->ms_instansi_id = decode_id($request->ms_instansi_id);
if(@$request->password){
$user->password = Hash::make($request->password);
}
@ -119,6 +121,7 @@ class UserController extends Controller
'email' => 'required|unique:users,email|email',
'name' => 'required|max:50',
'group' => 'required',
'ms_instansi_id' => '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
],[
@ -131,6 +134,7 @@ class UserController extends Controller
$user->email = $request->email;
$user->username = $request->username;
$user->ms_group_id = decode_id($request->group);
$user->ms_instansi_id = decode_id($request->ms_instansi_id);
if(@$request->password){
$user->password = Hash::make($request->password);
}
@ -226,6 +230,7 @@ class UserController extends Controller
'email' => $user->email,
'currYear' => date('Y'),
'group_id' => @$user->ms_group_id,
'instansi_id' => @$user->ms_instansi_id,
'group_alias' => @$user->group->alias,
'group_name' => @$user->group->name,
];

View File

@ -261,7 +261,12 @@ class DatasetController extends Controller
$data['route'] = $this->route;
$data['keyId'] = $id;
$data['item'] = Dataset::find($keyId);
$data['instansi'] = Instansi::all();
if(session('group_alias') == 'administrator'){
$data['instansi'] = Instansi::all();
}else{
$data['instansi'] = Instansi::where('MsInstansiId',session('instansi_id'))->get();
}
$data['topik'] = Topik::all();
$data['template'] = Template::all();
return view($this->template.'.form',$data);

View File

@ -47,4 +47,9 @@ class User extends Authenticatable
{
return $this->belongsTo(\App\Models\Master\Group::class,'ms_group_id','MsGroupId');
}
public function instansi()
{
return $this->belongsTo(\App\Models\Master\Instansi::class,'ms_instansi_id','MsInstansiId');
}
}

View File

@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->integer('ms_instansi_id')->after('id')->default(1);
$table->foreign('ms_instansi_id')->references('MsInstansiId')->on('ms_instansi')->cascadeOnDelete();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
//
});
}
};

View File

@ -6,6 +6,7 @@ namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Hash;
use App\Models\Master\Group;
use App\Models\Master\Instansi;
use App\Models\User;
class DatabaseSeeder extends Seeder
@ -37,6 +38,64 @@ class DatabaseSeeder extends Seeder
'status' => 1,
]);
}
$instansi = [
['type' => 'Biro' , 'name' => 'Biro Kepala Daerah'],
['type' => 'Biro' , 'name' => 'Biro Kerjasama Daerah'],
['type' => 'Biro' , 'name' => 'Biro Kesejahteraan Sosial'],
['type' => 'Biro' , 'name' => 'Biro Organisasi Dan Reformasi Birokrasi'],
['type' => 'Biro' , 'name' => 'Biro Pembangunan Dan Lingkungan Hidup'],
['type' => 'Biro' , 'name' => 'Biro Pemerintahan'],
['type' => 'Biro' , 'name' => 'Biro Pendidikan Dan Mental Spiritual'],
['type' => 'Biro' , 'name' => 'Biro Perekonomian Dan Keuangan'],
['type' => 'Biro' , 'name' => 'Biro Umum dan Administrasi Sekretariat Daerah'],
['type' => 'Biro' , 'name' => 'Biro Hukum'],
['type' => 'Badan' , 'name' => 'Badan Perencanaan Pembangunan Daerah (Bappeda)'],
['type' => 'Badan' , 'name' => 'Badan Pengelola Keuangan Daerah (BPKD)'],
['type' => 'Badan' , 'name' => 'Badan Pengelola Aset Daerah (BPAD)'],
['type' => 'Badan' , 'name' => 'Badan Pendapatan Daerah (Bapenda)'],
['type' => 'Badan' , 'name' => 'Badan Kesatuan Bangsa dan Politik (Kesbangpol)'],
['type' => 'Badan' , 'name' => 'Badan Pembinaan Badan Usaha Milik Daerah (BPBUMD)'],
['type' => 'Badan' , 'name' => 'Badan Kepegawaian Daerah (BKD)'],
['type' => 'Badan' , 'name' => 'Badan Pengembangan Sumber Daya Manusia (BPSDM)'],
['type' => 'Badan' , 'name' => 'Badan Penanggulangan Bencana Daerah (BPBD)'],
['type' => 'Badan' , 'name' => 'Badan Pelayanan Pengadaan Barang dan Jasa (BPPBJ)'],
['type' => 'Deputi' , 'name' => 'Deputi Bidang Tata Ruang dan Lingkungan Hidup'],
['type' => 'Deputi' , 'name' => 'Deputi Bidang Pengendalian Kependudukan dan Permukiman'],
['type' => 'Deputi' , 'name' => 'Deputi Bidang Industri, Perdagangan dan Transportasi'],
['type' => 'Deputi' , 'name' => 'Deputi Bidang Budaya dan Pariwisata'],
['type' => 'Dinas' , 'name' => 'Dinas Pendidikan'],
['type' => 'Dinas' , 'name' => 'Dinas Kesehatan'],
['type' => 'Dinas' , 'name' => 'Dinas Bina Marga'],
['type' => 'Dinas' , 'name' => 'Dinas Sumber Daya Air'],
['type' => 'Dinas' , 'name' => 'Dinas Cipta Karya, Tata Ruang dan Pertanahan'],
['type' => 'Dinas' , 'name' => 'Dinas Perumahan Rakyat dan Kawasan Permukiman'],
['type' => 'Dinas' , 'name' => 'Dinas Penanggulangan Kebakaran dan Penyelamatan'],
['type' => 'Dinas' , 'name' => 'Dinas Sosial'],
['type' => 'Dinas' , 'name' => 'Dinas Tenaga Kerja, Transmigrasi dan Energi'],
['type' => 'Dinas' , 'name' => 'Dinas Pemberdayaan, Perlindungan Anak dan Pengendalian Penduduk'],
['type' => 'Dinas' , 'name' => 'Dinas Ketahanan Pangan, Kelautan dan Pertanian'],
['type' => 'Dinas' , 'name' => 'Dinas Lingkungan Hidup'],
['type' => 'Dinas' , 'name' => 'Dinas Kependudukan dan Pencatatan Sipil'],
['type' => 'Dinas' , 'name' => 'Dinas Perhubungan'],
['type' => 'Dinas' , 'name' => 'Dinas Komunikasi, Informatika dan Statistik'],
['type' => 'Dinas' , 'name' => 'Dinas Perindustrian, Perdagangan, Koperasi dan Usaha Kecil Menengah'],
['type' => 'Dinas' , 'name' => 'Dinas Penanaman Modal dan Pelayanan Terpadu Satu Pintu'],
['type' => 'Dinas' , 'name' => 'Dinas Pemuda dan Olahraga'],
['type' => 'Dinas' , 'name' => 'Dinas Pariwisata dan Ekonomi Kreatif'],
['type' => 'Dinas' , 'name' => 'Dinas Perpustakaan dan Kearsipan'],
['type' => 'Dinas' , 'name' => 'Dinas Pertamanan dan Hutan Kota'],
['type' => 'Dinas' , 'name' => 'Dinas Kebudayaan'],
];
foreach($instansi as $dataInstansi){
Instansi::updateOrCreate([
'parent' => $dataInstansi['type'],
'name' => $dataInstansi['name'],
],[
'parent' => $dataInstansi['type'],
'name' => $dataInstansi['name'],
]);
}
User::updateOrCreate([
'name' => 'Administrator',
@ -47,7 +106,119 @@ class DatabaseSeeder extends Seeder
'username' => 'administrator',
'email' => 'admindikplhd@dlh.go.id',
'ms_group_id' => '1',
'ms_instansi_id' => '1',
'password' => Hash::make('##Dikplhd2025'),
]);
$menu = [
[
'parent_id' => '0',
'title' => 'Master Data',
'module' => 'modules.master.*',
'url' => '#',
'menu_type' => 'sidebar',
'menu_icon' => 'ri-database-2-line',
'ordering' => '5',
'status' => 'true',
'created_by' => '1',
'updated_by' => '0'
],[
'parent_id' => '0',
'title' => 'User & Hak Akses',
'module' => 'modules.management.*',
'url' => '#',
'menu_type' => 'sidebar',
'menu_icon' => 'ri-database-2-line',
'ordering' => '5',
'status' => 'true',
'created_by' => '1',
'updated_by' => '0'
],[
'parent_id' => '2',
'title' => 'Data Users',
'module' => 'modules.management.user.*',
'url' => 'management/user',
'menu_type' => 'sidebar',
'menu_icon' => 'ri-user-line',
'ordering' => '1',
'status' => 'true',
'created_by' => '1',
'updated_by' => '0'
],[
'parent_id' => '2',
'title' => 'Data Role User',
'module' => 'modules.management.role.*',
'url' => 'management/role',
'menu_type' => 'sidebar',
'menu_icon' => 'ri-share-line',
'ordering' => '3',
'status' => 'true',
'created_by' => '1',
'updated_by' => '0'
],[
'parent_id' => '1',
'title' => 'Data Instansi',
'module' => 'modules.instansi.*',
'url' => 'master/instansi',
'menu_type' => 'sidebar',
'menu_icon' => 'ri-home-line',
'ordering' =>'1',
'status' => 'true',
'created_by' => '1',
'updated_by' => '0'
],[
'parent_id' => '0',
'title' => 'Open Data',
'module' => 'modules.opendata.*',
'url' => '#',
'menu_type' => 'sidebar',
'menu_icon' => 'ri-database-2-line',
'ordering' => '1',
'status' => 'true',
'created_by' => '1',
'updated_by' => '0'
],[
'parent_id' => '6',
'title' => 'Dataset',
'module' => 'modules.opendata.dataset.*',
'url' => 'opendata/dataset',
'menu_type' => 'sidebar',
'menu_icon' => 'ri-database-2-line',
'ordering' => '1',
'status' => 'true',
'created_by' => '1',
'updated_by' => '0'
],
];
foreach($menu as $dataMenu){
Menu::updateOrCreate([
'parent_id' => $dataMenu['parent_id'],
'title' => $dataMenu['title'],
'module' => $dataMenu['module'],
'url' => $dataMenu['url'],
'menu_type' => $dataMenu['menu_type'],
'menu_icon' => $dataMenu['menu_icon'],
'ordering' => $dataMenu['ordering'],
'status' => $dataMenu['status'],
'created_by' => $dataMenu['created_by'],
'updated_by' => $dataMenu['updated_by'],
],[
'parent_id' => $dataMenu['parent_id'],
'title' => $dataMenu['title'],
'module' => $dataMenu['module'],
'url' => $dataMenu['url'],
'menu_type' => $dataMenu['menu_type'],
'menu_icon' => $dataMenu['menu_icon'],
'ordering' => $dataMenu['ordering'],
'status' => $dataMenu['status'],
'created_by' => $dataMenu['created_by'],
'updated_by' => $dataMenu['updated_by'],
]);
}
}
}

View File

@ -1,4 +1,7 @@
@extends('layouts.master')
@section('css')
<link rel="stylesheet" href="{{asset('assets/libs/choices.js/public/assets/styles/choices.min.css')}}">
@endsection
@section('content')
<div class="flex flex-col gap-6">
<div class="card">
@ -45,6 +48,30 @@
<span class="invalid-feedback" style="display: block!important;"><strong>{{$message}}</strong></span>
@enderror
</div>
<div class="mb-3">
<label class="mb-3">Jenis Instansi</label>
<select name="type" id="type" class="form-input @error('type') is-invalid @enderror" required>
<option value="">-Pilih Jenis Instansi-</option>
<option {{@$item->instansi->parent == 'Biro' ? 'selected' : '' }} value="Biro">Biro</option>
<option {{@$item->instansi->parent == 'Badan' ? 'selected' : '' }} value="Badan">Badan</option>
<option {{@$item->instansi->parent == 'Deputi' ? 'selected' : '' }} value="Deputi">Deputi</option>
<option {{@$item->instansi->parent == 'Dinas' ? 'selected' : '' }} value="Dinas">Dinas</option>
</select>
</div>
<div class="mb-3">
<label class="mb-3">Instansi</label>
<select name="ms_instansi_id" data-trigger id="ms_instansi_id" class="form-input @error('ms_instansi_id') is-invalid @enderror" required>
<option value="">-Pilih Jenis Instansi-</option>
@if(@$item)
<option selected value="{{encode_id(@$item->ms_instansi_id)}}">{{@$item->instansi->name}}</option>
@endif
</select>
@error('ms_instansi_id')
<span class="invalid-feedback" style="display: block!important;"><strong>{{$message}}</strong></span>
@enderror
</div>
</div>
<div class="grid lg:grid-cols-1">
<div class="mb-3">
@ -68,25 +95,44 @@
</div>
</div>
@endsection
@section('page-js')
@section('js')
<script src="{{asset('assets/libs/choices.js/public/assets/scripts/choices.min.js')}}"></script>
<script type="text/javascript">
$(document).ready(function() {
$('.numberInput').on('input', function() {
this.value = this.value.replace(/[^0-9]/g, ''); // Hanya angka 0-9
});
$('#togglePassword').on('click', function() {
let passwordField = $('#password');
let icon = $(this).find('i');
const typeSelect = document.getElementById('type');
const instansiSelect = document.getElementById('ms_instansi_id');
const choicesInstansi = new Choices(instansiSelect, {
allowHTML: false,
searchPlaceholderValue: 'Pilih Instansi terlebih dahulu',
});
// Cek apakah input saat ini bertipe password
if (passwordField.attr('type') === 'password') {
passwordField.attr('type', 'text'); // Ubah ke teks
icon.removeClass('fa-eye').addClass('fa-eye-slash'); // Ganti ikon
} else {
passwordField.attr('type', 'password'); // Ubah ke password
icon.removeClass('fa-eye-slash').addClass('fa-eye'); // Kembalikan ikon
}
// Ketika user memilih sekolah, load ulang kelas
typeSelect.addEventListener('change', function() {
const type = this.value;
// Kosongkan pilihan kelas sebelumnya
choicesInstansi.clearChoices();
// Load data kelas berdasarkan type
choicesInstansi.setChoices(() => {
return fetch(`{{ url('getInstansi') }}/${type}`)
.then(res => res.json())
.then(res => {
return res.data.map(item => ({
label: item.name,
value: item.id
}));
})
.catch(err => {
console.error('Gagal load instansi:', err);
return [];
});
});
});
$(document).ready(function() {
});
</script>
@endsection

View File

@ -12,7 +12,9 @@
</div>
<div class="p-6">
<div id="toolbar">
@if(permission('is_create', $route.'.*','module',false) || permission('is_update', $route.'.*','module',false))
<a href="{{route($route.'.update')}}" class="btn bg-success text-white"><i class="ri-add-line"></i>&nbsp;Tambah Data</a>
@endif
</div>
<table class="gridjs-table"
data-search="true"

View File

@ -5,6 +5,7 @@ use App\Http\Middleware\Session;
use App\Http\Controllers\FrontController;
use App\Http\Controllers\Auth\CustomLoginController;
use App\Http\Controllers\Auth\CustomRegisterController;
use App\Http\Controllers\AjaxController;
/*
|--------------------------------------------------------------------------
@ -24,6 +25,8 @@ Route::post('login',[CustomLoginController::class,'post_login'])->name('post_log
Route::get('register',[CustomRegisterController::class,'index'])->name('register');
Route::post('register',[CustomRegisterController::class,'post_register'])->name('post_register');
Route::get('getInstansi/{type}',[AjaxController::class,'getInstansi'])->name('getInstansi');
Route::middleware(Session::class)->name('modules.')->group(function () {
include_route_files(__DIR__ . '/modules');