update
parent
934f8cd554
commit
ada0c442b9
|
@ -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]);
|
||||
}
|
||||
}
|
|
@ -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,
|
||||
];
|
||||
|
|
|
@ -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,
|
||||
];
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
//
|
||||
});
|
||||
}
|
||||
};
|
|
@ -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'],
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
|
@ -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> Tambah Data</a>
|
||||
@endif
|
||||
</div>
|
||||
<table class="gridjs-table"
|
||||
data-search="true"
|
||||
|
|
|
@ -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');
|
||||
|
|
Loading…
Reference in New Issue