progress
This commit is contained in:
parent
0d7a1faa44
commit
de1216c5f5
@ -47,6 +47,7 @@ class AksesFileController extends Controller
|
|||||||
'pegawai_nama_entry' => auth()->user()?->dataUser?->namalengkap,
|
'pegawai_nama_entry' => auth()->user()?->dataUser?->namalengkap,
|
||||||
'entry_at' => Carbon::now()->format('Y-m-d H:i:s.u'),
|
'entry_at' => Carbon::now()->format('Y-m-d H:i:s.u'),
|
||||||
'all_akses' => $data['akses'] === "all" ? true : false,
|
'all_akses' => $data['akses'] === "all" ? true : false,
|
||||||
|
'master_akses' => $data['master_akses'] === "yes" ? true : false,
|
||||||
];
|
];
|
||||||
$af = AksesFile::create($payload);
|
$af = AksesFile::create($payload);
|
||||||
if($data['akses'] === "unit"){
|
if($data['akses'] === "unit"){
|
||||||
@ -160,6 +161,7 @@ class AksesFileController extends Controller
|
|||||||
'pegawai_nama_modified' => auth()->user()?->dataUser?->namalengkap,
|
'pegawai_nama_modified' => auth()->user()?->dataUser?->namalengkap,
|
||||||
'modified_at' => Carbon::now()->format('Y-m-d H:i:s.u'),
|
'modified_at' => Carbon::now()->format('Y-m-d H:i:s.u'),
|
||||||
'all_akses' => request('akses') === "all" ? true : false,
|
'all_akses' => request('akses') === "all" ? true : false,
|
||||||
|
'master_akses' => request('master_akses') === "yes" ? true : false,
|
||||||
];
|
];
|
||||||
$data->update($payload);
|
$data->update($payload);
|
||||||
|
|
||||||
|
|||||||
@ -70,7 +70,6 @@ class DashboardController extends Controller
|
|||||||
$subArray = $subUnit ? explode(',', $subUnit) : [];
|
$subArray = $subUnit ? explode(',', $subUnit) : [];
|
||||||
$katArray = $kategori ? explode(',', $kategori) : [];
|
$katArray = $kategori ? explode(',', $kategori) : [];
|
||||||
$katDok = MasterKategori::when($katArray, fn($q) => $q->whereIn('master_kategori_directory_id', $katArray))->where('statusenabled', true)->select('master_kategori_directory_id', 'nama_kategori_directory')->get();
|
$katDok = MasterKategori::when($katArray, fn($q) => $q->whereIn('master_kategori_directory_id', $katArray))->where('statusenabled', true)->select('master_kategori_directory_id', 'nama_kategori_directory')->get();
|
||||||
|
|
||||||
if ($katArray && $filterUnit && $subArray) {
|
if ($katArray && $filterUnit && $subArray) {
|
||||||
/* mode pencarian lengkap */
|
/* mode pencarian lengkap */
|
||||||
if ($allowedUnitIds && !$allowedUnitIds->contains((int) $filterUnit)) {
|
if ($allowedUnitIds && !$allowedUnitIds->contains((int) $filterUnit)) {
|
||||||
@ -80,13 +79,12 @@ class DashboardController extends Controller
|
|||||||
->where('id', $filterUnit)
|
->where('id', $filterUnit)
|
||||||
->with(['subUnitKerja' => fn($q) => $q->whereIn('id', $subArray)
|
->with(['subUnitKerja' => fn($q) => $q->whereIn('id', $subArray)
|
||||||
->with(['fileDirectory' => fn($q) => $q
|
->with(['fileDirectory' => fn($q) => $q
|
||||||
->where('id_unit_kerja', $filterUnit)
|
->where('id_unit_kerja', $filterUnit)->whereNotNull('status_action')
|
||||||
->when($subArray, fn($q) => $q->whereIn('id_sub_unit_kerja', $subArray))
|
->when($subArray, fn($q) => $q->whereIn('id_sub_unit_kerja', $subArray))
|
||||||
->when($katArray, fn($q) => $q->whereIn('master_kategori_directory_id', $katArray))
|
->when($katArray, fn($q) => $q->whereIn('master_kategori_directory_id', $katArray))
|
||||||
->when($keyword, fn($q) =>
|
->when($keyword, fn($q) =>
|
||||||
$q->where(function($query) use ($keyword) {
|
$q->where(function($query) use ($keyword) {
|
||||||
$query->where('file', 'ilike', "%{$keyword}%")
|
$query->where('file', 'ilike', "%{$keyword}%");
|
||||||
->orWhere('pegawai_nama_entry', 'ilike', "%{$keyword}%");
|
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
])
|
])
|
||||||
@ -99,9 +97,8 @@ class DashboardController extends Controller
|
|||||||
/* all akses */
|
/* all akses */
|
||||||
$unitKerja = UnitKerja::where('statusenabled', true)->with([ // muat relasi
|
$unitKerja = UnitKerja::where('statusenabled', true)->with([ // muat relasi
|
||||||
'subUnitKerja' => fn($q) => $q->with([ // sub-unit
|
'subUnitKerja' => fn($q) => $q->with([ // sub-unit
|
||||||
'fileDirectory' => fn($f) => $f->when($keyword, fn($q) =>
|
'fileDirectory' => fn($f) => $f->whereNotNull('status_action')->when($keyword, fn($q) =>
|
||||||
$q->where('file', 'ilike', "%{$keyword}%")
|
$q->where('file', 'ilike', "%{$keyword}%")
|
||||||
->orWhere('pegawai_nama_entry', 'ilike', "%{$keyword}%")
|
|
||||||
)
|
)
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
@ -109,15 +106,13 @@ class DashboardController extends Controller
|
|||||||
->get();
|
->get();
|
||||||
|
|
||||||
} elseif ($allowedUnitIds) {
|
} elseif ($allowedUnitIds) {
|
||||||
/* akses per unit (single/multiple) */
|
|
||||||
$unitKerja = UnitKerja::where('statusenabled', true)
|
$unitKerja = UnitKerja::where('statusenabled', true)
|
||||||
->whereIn('id', $allowedUnitIds)
|
->whereIn('id', $allowedUnitIds)
|
||||||
->with([ // muat relasi
|
->with([
|
||||||
'subUnitKerja' => fn($q) => $q->with([ // sub-unit
|
'subUnitKerja' => fn($q) => $q->with([
|
||||||
'fileDirectory' => fn($f) => $f->when($keyword, fn($q) =>
|
'fileDirectory' => fn($f) => $f->whereNotNull('status_action')->when($keyword, fn($q) =>
|
||||||
$q->where(function($query) use ($keyword) {
|
$q->where(function($query) use ($keyword) {
|
||||||
$query->where('file', 'ilike', "%{$keyword}%")
|
$query->where('file', 'ilike', "%{$keyword}%");
|
||||||
->orWhere('pegawai_nama_entry', 'ilike', "%{$keyword}%");
|
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
])
|
])
|
||||||
@ -126,7 +121,6 @@ class DashboardController extends Controller
|
|||||||
->get();
|
->get();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
/* default : unit & sub milik sendiri */
|
|
||||||
$authUnit = $user?->mappingUnitKerjaPegawai[0]?->objectunitkerjapegawaifk;
|
$authUnit = $user?->mappingUnitKerjaPegawai[0]?->objectunitkerjapegawaifk;
|
||||||
$authSub = $user?->mappingUnitKerjaPegawai[0]?->objectsubunitkerjapegawaifk;
|
$authSub = $user?->mappingUnitKerjaPegawai[0]?->objectsubunitkerjapegawaifk;
|
||||||
|
|
||||||
@ -135,10 +129,9 @@ class DashboardController extends Controller
|
|||||||
->with([ // 1. sub-unit milik user
|
->with([ // 1. sub-unit milik user
|
||||||
'subUnitKerja' => fn($q) => $q->where('id', $authSub)
|
'subUnitKerja' => fn($q) => $q->where('id', $authSub)
|
||||||
->with([ // 2. file-directory + filter keyword
|
->with([ // 2. file-directory + filter keyword
|
||||||
'fileDirectory' => fn($f) => $f->when($keyword, fn($q) =>
|
'fileDirectory' => fn($f) => $f->whereNotNull('status_action')->when($keyword, fn($q) =>
|
||||||
$q->where(function($query) use ($keyword) {
|
$q->where(function($query) use ($keyword) {
|
||||||
$query->where('file', 'ilike', "%{$keyword}%")
|
$query->where('file', 'ilike', "%{$keyword}%");
|
||||||
->orWhere('pegawai_nama_entry', 'ilike', "%{$keyword}%");
|
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
])
|
])
|
||||||
@ -403,7 +396,7 @@ class DashboardController extends Controller
|
|||||||
$akses = AksesFile::where(['pegawai_id' => $user->id, 'statusenabled' => true])->first();
|
$akses = AksesFile::where(['pegawai_id' => $user->id, 'statusenabled' => true])->first();
|
||||||
$keyword = request('keyword');
|
$keyword = request('keyword');
|
||||||
|
|
||||||
$query = FileDirectory::where('statusenabled', true)
|
$query = FileDirectory::where('statusenabled', true)->whereNotNull('status_action')
|
||||||
->when($keyword, function ($q) use ($keyword) {
|
->when($keyword, function ($q) use ($keyword) {
|
||||||
$q->where(function ($sub) use ($keyword) {
|
$q->where(function ($sub) use ($keyword) {
|
||||||
$sub->where('file', 'ILIKE', "%{$keyword}%")
|
$sub->where('file', 'ILIKE', "%{$keyword}%")
|
||||||
@ -674,8 +667,8 @@ class DashboardController extends Controller
|
|||||||
$perPage = (int) request('per_page', 10);
|
$perPage = (int) request('per_page', 10);
|
||||||
$page = max(1, (int) request('page', 1));
|
$page = max(1, (int) request('page', 1));
|
||||||
$keyword = strtolower(request('keyword', ''));
|
$keyword = strtolower(request('keyword', ''));
|
||||||
|
$authUnit = auth()->user()->masterPersetujuan->details->pluck('unit_pegawai_id')->unique()->toArray();
|
||||||
$rows = FileDirectory::where('statusenabled', true)->pluck('file');
|
$rows = FileDirectory::where('statusenabled', true)->whereNotNull('status_action')->whereIn('id_unit_kerja', $authUnit)->pluck('file');
|
||||||
|
|
||||||
$grouped = [];
|
$grouped = [];
|
||||||
foreach ($rows as $path) {
|
foreach ($rows as $path) {
|
||||||
@ -754,8 +747,9 @@ class DashboardController extends Controller
|
|||||||
$keyword = request('keyword');
|
$keyword = request('keyword');
|
||||||
$start = request('start_date');
|
$start = request('start_date');
|
||||||
$end = request('end_date');
|
$end = request('end_date');
|
||||||
|
$authUnit = auth()->user()->masterPersetujuan->details->pluck('unit_pegawai_id')->unique()->toArray();
|
||||||
|
|
||||||
$query = FileDirectory::where('statusenabled', true)->whereNull('status_action')->orderBy('entry_at','desc');
|
$query = FileDirectory::where('statusenabled', true)->whereNull('status_action')->whereIn('id_unit_kerja', $authUnit)->orderBy('entry_at','desc');
|
||||||
if($keyword){
|
if($keyword){
|
||||||
$query->where(function($q) use ($keyword){
|
$query->where(function($q) use ($keyword){
|
||||||
$q->where('file', 'ILIKE', "%{$keyword}%")
|
$q->where('file', 'ILIKE', "%{$keyword}%")
|
||||||
@ -886,9 +880,10 @@ class DashboardController extends Controller
|
|||||||
|
|
||||||
public function countDataPending(){
|
public function countDataPending(){
|
||||||
try {
|
try {
|
||||||
$count = FileDirectory::where('statusenabled', true)
|
$query = FileDirectory::where('statusenabled', true)
|
||||||
->whereNull('status_action')
|
->whereNull('status_action');
|
||||||
->count();
|
$authUnit = auth()->user()->masterPersetujuan->details->pluck('unit_pegawai_id')->unique()->toArray();
|
||||||
|
$count= $query->whereIn('id_unit_kerja', $authUnit)->count();
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'status' => true,
|
'status' => true,
|
||||||
'count' => $count,
|
'count' => $count,
|
||||||
|
|||||||
@ -22,7 +22,12 @@ class LogActivityController extends Controller
|
|||||||
|
|
||||||
$query = LogActivity::query()
|
$query = LogActivity::query()
|
||||||
->orderBy('entry_at','desc');
|
->orderBy('entry_at','desc');
|
||||||
|
if(auth()->user()->masterPersetujuan){
|
||||||
|
$authUnit = auth()->user()->masterPersetujuan->details->pluck('unit_pegawai_id')->unique()->toArray();
|
||||||
|
$query = $query->whereIn('id_unit_kerja', $authUnit);
|
||||||
|
}else{
|
||||||
|
$query = $query->where('pegawai_id_entry', auth()->user()->objectpegawaifk);
|
||||||
|
}
|
||||||
if($keyword){
|
if($keyword){
|
||||||
$query->where(function($q) use ($keyword){
|
$query->where(function($q) use ($keyword){
|
||||||
$q->where('pegawai_nama_entry', 'ILIKE', "%{$keyword}%")
|
$q->where('pegawai_nama_entry', 'ILIKE', "%{$keyword}%")
|
||||||
|
|||||||
22
app/Http/Middleware/EnsureMasterAkses.php
Normal file
22
app/Http/Middleware/EnsureMasterAkses.php
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Middleware;
|
||||||
|
|
||||||
|
use Closure;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
|
||||||
|
class EnsureMasterAkses
|
||||||
|
{
|
||||||
|
public function handle(Request $request, Closure $next): Response
|
||||||
|
{
|
||||||
|
$user = $request->user();
|
||||||
|
$hasAccess = $user && $user->akses && $user->akses->master_akses;
|
||||||
|
|
||||||
|
if (!$hasAccess) {
|
||||||
|
abort(403, 'Tidak memiliki akses.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
}
|
||||||
22
app/Http/Middleware/EnsureMasterPersetujuan.php
Normal file
22
app/Http/Middleware/EnsureMasterPersetujuan.php
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Middleware;
|
||||||
|
|
||||||
|
use Closure;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
|
||||||
|
class EnsureMasterPersetujuan
|
||||||
|
{
|
||||||
|
public function handle(Request $request, Closure $next): Response
|
||||||
|
{
|
||||||
|
$user = $request->user();
|
||||||
|
$hasAccess = $user && $user->masterPersetujuan;
|
||||||
|
|
||||||
|
if (!$hasAccess) {
|
||||||
|
abort(403, 'Tidak memiliki akses.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -45,8 +45,16 @@ class User extends Authenticatable
|
|||||||
'katasandi' => 'hashed',
|
'katasandi' => 'hashed',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
protected $with = ['dataUser'];
|
protected $with = ['dataUser', 'masterPersetujuan', 'akses'];
|
||||||
public function dataUser(){
|
public function dataUser(){
|
||||||
return $this->belongsTo(DataUser::class, 'objectpegawaifk', 'id')->select('id', 'namalengkap');
|
return $this->belongsTo(DataUser::class, 'objectpegawaifk', 'id')->select('id', 'namalengkap');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function masterPersetujuan(){
|
||||||
|
return $this->belongsTo(masterPersetujuan::class, 'objectpegawaifk', 'pegawai_id')->where('statusenabled', true)->with('details');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function akses(){
|
||||||
|
return $this->belongsTo(AksesFile::class, 'objectpegawaifk', 'pegawai_id')->where('statusenabled', true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,10 @@ return Application::configure(basePath: dirname(__DIR__))
|
|||||||
health: '/up',
|
health: '/up',
|
||||||
)
|
)
|
||||||
->withMiddleware(function (Middleware $middleware): void {
|
->withMiddleware(function (Middleware $middleware): void {
|
||||||
//
|
$middleware->alias([
|
||||||
|
'akses.master' => \App\Http\Middleware\EnsureMasterAkses::class,
|
||||||
|
'master.persetujuan' => \App\Http\Middleware\EnsureMasterPersetujuan::class,
|
||||||
|
]);
|
||||||
})
|
})
|
||||||
->withExceptions(function (Exceptions $exceptions): void {
|
->withExceptions(function (Exceptions $exceptions): void {
|
||||||
//
|
//
|
||||||
|
|||||||
5
public/assets/css/styles.min.css
vendored
5
public/assets/css/styles.min.css
vendored
@ -15647,7 +15647,7 @@ textarea.form-control-lg {
|
|||||||
.left-sidebar .scroll-sidebar {
|
.left-sidebar .scroll-sidebar {
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
padding: 0 24px;
|
padding: 0 24px;
|
||||||
height: calc(100vh - 310px);
|
height: calc(100vh - 120px);
|
||||||
border-radius: 7px;
|
border-radius: 7px;
|
||||||
}
|
}
|
||||||
.left-sidebar .scroll-sidebar .simplebar-track.simplebar-horizontal {
|
.left-sidebar .scroll-sidebar .simplebar-track.simplebar-horizontal {
|
||||||
@ -15818,11 +15818,10 @@ textarea.form-control-lg {
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
background: var(--bs-body-bg);
|
background: var(--bs-body-bg);
|
||||||
padding: 0 10px;
|
padding: 0 10px;
|
||||||
/* top: 65px; */
|
|
||||||
}
|
}
|
||||||
@media (max-width: 991.98px) {
|
@media (max-width: 991.98px) {
|
||||||
.app-header {
|
.app-header {
|
||||||
top: 131px;
|
top: 0px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.app-header .container-fluid, .app-header .container-sm, .app-header .container-md, .app-header .container-lg, .app-header .container-xl, .app-header .container-xxl {
|
.app-header .container-fluid, .app-header .container-sm, .app-header .container-md, .app-header .container-lg, .app-header .container-xl, .app-header .container-xxl {
|
||||||
|
|||||||
@ -105,7 +105,7 @@ function editAkses(e){
|
|||||||
formEditAkses.attr('action', `/akses/${data.akses_file_id}`)
|
formEditAkses.attr('action', `/akses/${data.akses_file_id}`)
|
||||||
$("#unit_akses_edit").empty().trigger('change');
|
$("#unit_akses_edit").empty().trigger('change');
|
||||||
$("#unit_akses_wrapper_edit").addClass('d-none');
|
$("#unit_akses_wrapper_edit").addClass('d-none');
|
||||||
|
$("#master_akses_edit").prop("checked", data.master_akses == 1)
|
||||||
selectOptionPegawaiEdit()
|
selectOptionPegawaiEdit()
|
||||||
selectOptionUnitKerjaEdit()
|
selectOptionUnitKerjaEdit()
|
||||||
if (data.pegawai_id) {
|
if (data.pegawai_id) {
|
||||||
|
|||||||
@ -18,6 +18,8 @@
|
|||||||
{
|
{
|
||||||
title:"Action",
|
title:"Action",
|
||||||
formatter: function(value, row){
|
formatter: function(value, row){
|
||||||
|
console.log(row);
|
||||||
|
|
||||||
let buttons = '';
|
let buttons = '';
|
||||||
buttons += `
|
buttons += `
|
||||||
<button class="btn btn-sm btn-danger me-2" onclick="deleteAkses(this)"
|
<button class="btn btn-sm btn-danger me-2" onclick="deleteAkses(this)"
|
||||||
@ -31,7 +33,9 @@
|
|||||||
data-pegawai_id="${row?.pegawai_id}"
|
data-pegawai_id="${row?.pegawai_id}"
|
||||||
data-pegawai_nama="${row?.pegawai?.namalengkap}"
|
data-pegawai_nama="${row?.pegawai?.namalengkap}"
|
||||||
data-unit_id="${row?.unit_akses}"
|
data-unit_id="${row?.unit_akses}"
|
||||||
data-unit_nama="${row?.akses?.name}">
|
data-unit_nama="${row?.akses?.name}"
|
||||||
|
data-master_akses="${row?.master_akses ? 1 : 0}"
|
||||||
|
>
|
||||||
<i class="fa-solid fa-pencil"></i>
|
<i class="fa-solid fa-pencil"></i>
|
||||||
</button>`
|
</button>`
|
||||||
return `
|
return `
|
||||||
|
|||||||
@ -107,8 +107,14 @@ function addForm(){
|
|||||||
By Unit Akses
|
By Unit Akses
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input class="form-check-input" type="checkbox"
|
||||||
|
name="data[${colCount}][master_akses]" id="akses_unit_${colCount}" value="yes">
|
||||||
|
<label class="form-check-label">
|
||||||
|
Akses Master
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<small class="text-muted">Pilih salah satu.</small>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4 mb-2 d-none" id="unit_akses_wrapper_${colCount}">
|
<div class="col-md-4 mb-2 d-none" id="unit_akses_wrapper_${colCount}">
|
||||||
<label>Unit Kerja</label>
|
<label>Unit Kerja</label>
|
||||||
|
|||||||
@ -143,14 +143,16 @@ function searchData(){
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
index(kategori_dok, unitKerja, subUnitKerja, [], keyword);
|
index(kategori_dok, unitKerja, subUnitKerja, keyword);
|
||||||
}
|
}
|
||||||
|
|
||||||
let debounceTimer;
|
let debounceTimer;
|
||||||
function debounceSearch(input) {
|
function debounceSearch(value) {
|
||||||
|
console.log(value);
|
||||||
|
|
||||||
clearTimeout(debounceTimer);
|
clearTimeout(debounceTimer);
|
||||||
debounceTimer = setTimeout(() => {
|
debounceTimer = setTimeout(() => {
|
||||||
searchFile(input.value.trim());
|
searchFile(value.trim());
|
||||||
}, 300);
|
}, 300);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,7 +161,8 @@ function searchFile(keyword){
|
|||||||
let kategori_dok = $("#kategori_dok").val()
|
let kategori_dok = $("#kategori_dok").val()
|
||||||
let unitKerja = $("#unit_kerja").val()
|
let unitKerja = $("#unit_kerja").val()
|
||||||
let subUnitKerja = $("#sub_unit_kerja").val()
|
let subUnitKerja = $("#sub_unit_kerja").val()
|
||||||
index(kategori_dok, unitKerja, subUnitKerja, [], keyword);
|
|
||||||
|
index(kategori_dok, unitKerja, subUnitKerja, keyword);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -77,13 +77,13 @@ function addForm(){
|
|||||||
</select>
|
</select>
|
||||||
<small class="text-muted">Cari nama pegawai.</small>
|
<small class="text-muted">Cari nama pegawai.</small>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-8 mb-2" id="unit_akses_wrapper_${colCount}">
|
<div class="col-md-7 mb-2" id="unit_akses_wrapper_${colCount}">
|
||||||
<label>Unit Kerja</label>
|
<label>Unit Kerja</label>
|
||||||
<select class="form-control" name="data[${colCount}][unit_akses][]" id="unit_akses_${colCount}" multiple>
|
<select class="form-control" name="data[${colCount}][unit_akses][]" id="unit_akses_${colCount}" multiple>
|
||||||
</select>
|
</select>
|
||||||
<small class="text-muted">Bisa pilih lebih dari satu.</small>
|
<small class="text-muted">Bisa pilih lebih dari satu.</small>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-2">
|
<div class="col-md-1">
|
||||||
<button type="button" class="btn btn-danger mt-3 me-2" onclick="removeCol(${colCount})"><i class="fa-solid fa-trash"></i></button>
|
<button type="button" class="btn btn-danger mt-3 me-2" onclick="removeCol(${colCount})"><i class="fa-solid fa-trash"></i></button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@ -24,7 +24,7 @@
|
|||||||
<div class="col-12 col-md-4">
|
<div class="col-12 col-md-4">
|
||||||
<label class="form-label mb-1 d-block">Akses</label>
|
<label class="form-label mb-1 d-block">Akses</label>
|
||||||
|
|
||||||
<div class="d-flex flex-wrap gap-3">
|
<div class="d-flex flex-wrap gap-2">
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="radio"
|
<input class="form-check-input" type="radio"
|
||||||
name="data[0][akses]" id="akses_all_0" value="all" checked
|
name="data[0][akses]" id="akses_all_0" value="all" checked
|
||||||
@ -42,9 +42,15 @@
|
|||||||
By Unit Akses
|
By Unit Akses
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<small class="text-muted">Pilih salah satu.</small>
|
<div class="form-check">
|
||||||
|
<input class="form-check-input" type="checkbox"
|
||||||
|
name="data[0][master_akses]" id="akses_unit_0" value="yes">
|
||||||
|
<label class="form-check-label" for="akses_unit_0">
|
||||||
|
Akses Master
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4 mb-2 d-none" id="unit_akses_wrapper_0">
|
<div class="col-md-4 mb-2 d-none" id="unit_akses_wrapper_0">
|
||||||
<label class="form-label">Unit Kerja</label>
|
<label class="form-label">Unit Kerja</label>
|
||||||
|
|||||||
@ -24,7 +24,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-12 col-md-2">
|
<div class="col-12 col-md-2">
|
||||||
<label class="form-label mb-1 d-block">Akses</label>
|
<label class="form-label mb-1 d-block">Akses</label>
|
||||||
<div class="d-flex flex-wrap gap-3">
|
<div class="d-flex flex-wrap gap-2">
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="radio"
|
<input class="form-check-input" type="radio"
|
||||||
name="akses" id="akses_all_edit" value="all"
|
name="akses" id="akses_all_edit" value="all"
|
||||||
@ -41,8 +41,15 @@
|
|||||||
By Unit Akses
|
By Unit Akses
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input class="form-check-input" type="checkbox"
|
||||||
|
name="master_akses" id="master_akses_edit" value="yes">
|
||||||
|
<label class="form-check-label">
|
||||||
|
Akses Master
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<small class="text-muted">Pilih salah satu.</small>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12 col-md-6 d-none" id="unit_akses_wrapper_edit">
|
<div class="col-12 col-md-6 d-none" id="unit_akses_wrapper_edit">
|
||||||
<label class="form-label">Unit Kerja</label>
|
<label class="form-label">Unit Kerja</label>
|
||||||
|
|||||||
@ -122,7 +122,7 @@
|
|||||||
</button>
|
</button>
|
||||||
<div class="input-group input-group-sm" style="max-width:260px;">
|
<div class="input-group input-group-sm" style="max-width:260px;">
|
||||||
<span class="input-group-text bg-white"><i class="fa fa-search text-muted"></i></span>
|
<span class="input-group-text bg-white"><i class="fa fa-search text-muted"></i></span>
|
||||||
<input type="text" id="search_file" oninput="debounceSearch(this)" class="form-control" placeholder="Cari nama/no dokumen">
|
<input type="text" id="search_file" oninput="debounceSearch(this.value)" class="form-control" placeholder="Cari nama/no dokumen">
|
||||||
</div>
|
</div>
|
||||||
<div class="d-flex align-items-center gap-2 ms-auto">
|
<div class="d-flex align-items-center gap-2 ms-auto">
|
||||||
<span class="badge bg-success">Umum</span>
|
<span class="badge bg-success">Umum</span>
|
||||||
|
|||||||
@ -1,147 +1,177 @@
|
|||||||
<aside class="left-sidebar">
|
<aside class="left-sidebar">
|
||||||
<!-- Sidebar scroll-->
|
<div>
|
||||||
<div>
|
{{-- Logo --}}
|
||||||
<div class="brand-logo d-flex align-items-center justify-content-between">
|
<div class="brand-logo d-flex align-items-center justify-content-between">
|
||||||
<a href="/" class="text-nowrap logo-img">
|
<a href="{{ url('/') }}" class="text-nowrap logo-img">
|
||||||
<img src="logo/logo_rsabhk.png" alt="rsabhk" width="180" class="mt-2"/>
|
<img src="{{ asset('logo/logo_rsabhk.png') }}" alt="rsabhk" width="180" class="mt-2" />
|
||||||
</a>
|
</a>
|
||||||
<div class="close-btn d-xl-none d-block sidebartoggler cursor-pointer" id="sidebarCollapse">
|
|
||||||
<i class="ti ti-x fs-6"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- Sidebar navigation-->
|
|
||||||
<nav class="sidebar-nav scroll-sidebar" data-simplebar="">
|
|
||||||
<ul id="sidebarnav">
|
|
||||||
<li class="nav-small-cap">
|
|
||||||
<iconify-icon icon="solar:menu-dots-linear" class="nav-small-cap-icon fs-4"></iconify-icon>
|
|
||||||
<span class="hide-menu">Home</span>
|
|
||||||
</li>
|
|
||||||
<li class="sidebar-item">
|
|
||||||
<a class="sidebar-link" href="/" aria-expanded="false">
|
|
||||||
<i class="ti ti-dashboard"></i>
|
|
||||||
<span class="hide-menu">Dashboard</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li class="sidebar-item">
|
|
||||||
<a class="sidebar-link" href="/new" aria-expanded="false">
|
|
||||||
<i class="ti ti-layout-dashboard"></i>
|
|
||||||
<span class="hide-menu">Dashboard V2</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<!-- ---------------------------------- -->
|
|
||||||
<!-- Dashboard -->
|
|
||||||
<!-- ---------------------------------- -->
|
|
||||||
<li class="sidebar-item">
|
|
||||||
<a class="sidebar-link justify-content-between"
|
|
||||||
href="/master-kategori" aria-expanded="false">
|
|
||||||
<div class="d-flex align-items-center gap-3">
|
|
||||||
<span class="d-flex">
|
|
||||||
<i class="ti ti-file"></i>
|
|
||||||
</span>
|
|
||||||
<span class="hide-menu">Master Kategori</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</a>
|
<div class="close-btn d-xl-none d-block sidebartoggler cursor-pointer" id="sidebarCollapse">
|
||||||
</li>
|
<i class="ti ti-x fs-6"></i>
|
||||||
{{-- <li class="sidebar-item">
|
|
||||||
<a class="sidebar-link justify-content-between"
|
|
||||||
href="/master-klasifikasi" aria-expanded="false">
|
|
||||||
<div class="d-flex align-items-center gap-3">
|
|
||||||
<span class="d-flex">
|
|
||||||
<i class="ti ti-file"></i>
|
|
||||||
</span>
|
|
||||||
<span class="hide-menu">Master Klasifikasi</span>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</li> --}}
|
|
||||||
<li class="sidebar-item">
|
|
||||||
<a class="sidebar-link justify-content-between"
|
|
||||||
href="/akses" aria-expanded="false">
|
|
||||||
<div class="d-flex align-items-center gap-3">
|
|
||||||
<span class="d-flex">
|
|
||||||
<i class="ti ti-lock-access"></i>
|
|
||||||
</span>
|
|
||||||
<span class="hide-menu">Akses</span>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="sidebar-item">
|
|
||||||
<a class="sidebar-link justify-content-between"
|
|
||||||
href="/log-activity" aria-expanded="false">
|
|
||||||
<div class="d-flex align-items-center gap-3">
|
|
||||||
<span class="d-flex">
|
|
||||||
<i class="ti ti-activity"></i>
|
|
||||||
</span>
|
|
||||||
<span class="hide-menu">Log Aktivitas</span>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="sidebar-item">
|
|
||||||
<a class="sidebar-link justify-content-between"
|
|
||||||
href="/recap" aria-expanded="false">
|
|
||||||
<div class="d-flex align-items-center gap-3">
|
|
||||||
<span class="d-flex">
|
|
||||||
<i class="ti ti-report-analytics"></i>
|
|
||||||
</span>
|
|
||||||
<span class="hide-menu">Data Rekap</span>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li class="sidebar-item">
|
|
||||||
<a class="sidebar-link d-flex align-items-center justify-content-between"
|
|
||||||
href="/pending-file" aria-expanded="false">
|
|
||||||
|
|
||||||
<!-- Left -->
|
|
||||||
<div class="d-flex align-items-center gap-3">
|
|
||||||
<i class="ti ti-clock sidebar-icon"></i>
|
|
||||||
<span class="hide-menu">Persetujuan</span>
|
|
||||||
</div>
|
|
||||||
<!-- Right Badge -->
|
|
||||||
<span class="badge bg-danger rounded-pill sidebar-badge" id="pendingCountBadge">
|
|
||||||
0
|
|
||||||
</span>
|
|
||||||
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li class="sidebar-item">
|
|
||||||
<a class="sidebar-link justify-content-between"
|
|
||||||
href="/master-persetujuan" aria-expanded="false">
|
|
||||||
<div class="d-flex align-items-center gap-3">
|
|
||||||
<span class="d-flex">
|
|
||||||
<i class="ti ti-report-analytics"></i>
|
|
||||||
</span>
|
|
||||||
<span class="hide-menu">Master Persetujuan</span>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
<!-- End Sidebar navigation -->
|
|
||||||
</div>
|
</div>
|
||||||
<!-- End Sidebar scroll-->
|
</div>
|
||||||
</aside>
|
|
||||||
<script>
|
{{-- Sidebar nav --}}
|
||||||
function countData(){
|
@php
|
||||||
const badge = document.getElementById('pendingCountBadge');
|
$openMaster = request()->is('akses*') || request()->is('master-kategori*') || request()->is('master-persetujuan*');
|
||||||
if (!badge) return;
|
@endphp
|
||||||
fetch('/data/count-pending')
|
|
||||||
.then(res => res.json())
|
<nav class="sidebar-nav scroll-sidebar" data-simplebar="">
|
||||||
.then(data => {
|
<ul id="sidebarnav">
|
||||||
const count = data?.count ?? 0;
|
|
||||||
badge.textContent = count;
|
{{-- HOME --}}
|
||||||
if (count <= 0) {
|
<li class="nav-small-cap"><span class="hide-menu">Home</span></li>
|
||||||
badge.classList.add('d-none');
|
|
||||||
} else {
|
<li class="sidebar-item">
|
||||||
badge.classList.remove('d-none');
|
<a class="sidebar-link" href="{{ url('/') }}" aria-expanded="false">
|
||||||
}
|
<i class="ti ti-dashboard"></i>
|
||||||
})
|
<span class="hide-menu">Dashboard</span>
|
||||||
.catch(() => {
|
</a>
|
||||||
badge.classList.add('d-none');
|
</li>
|
||||||
});
|
|
||||||
}
|
<li class="sidebar-item">
|
||||||
countData();
|
<a class="sidebar-link" href="{{ url('/new') }}" aria-expanded="false">
|
||||||
</script>
|
<i class="ti ti-layout-dashboard"></i>
|
||||||
|
<span class="hide-menu">Dashboard V2</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
{{-- AKTIVITAS --}}
|
||||||
|
<li class="nav-small-cap"><span class="hide-menu">Aktivitas</span></li>
|
||||||
|
|
||||||
|
<li class="sidebar-item">
|
||||||
|
<a class="sidebar-link d-flex align-items-center justify-content-between"
|
||||||
|
href="{{ url('/log-activity') }}" aria-expanded="false">
|
||||||
|
<div class="d-flex align-items-center gap-3">
|
||||||
|
<i class="ti ti-activity"></i>
|
||||||
|
<span class="hide-menu">Log Aktivitas</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
@if($authUnit = auth()->user()->masterPersetujuan)
|
||||||
|
<li class="sidebar-item">
|
||||||
|
<a class="sidebar-link d-flex align-items-center justify-content-between"
|
||||||
|
href="{{ url('/pending-file') }}" aria-expanded="false">
|
||||||
|
|
||||||
|
<div class="d-flex align-items-center gap-3">
|
||||||
|
<i class="ti ti-clock"></i>
|
||||||
|
<span class="hide-menu">Persetujuan</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<span class="badge bg-danger rounded-pill d-none" id="pendingCountBadge">0</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
@endif
|
||||||
|
{{-- RECAP --}}
|
||||||
|
<li class="nav-small-cap"><span class="hide-menu">Recap</span></li>
|
||||||
|
|
||||||
|
<li class="sidebar-item">
|
||||||
|
<a class="sidebar-link d-flex align-items-center justify-content-between"
|
||||||
|
href="{{ url('/recap') }}" aria-expanded="false">
|
||||||
|
<div class="d-flex align-items-center gap-3">
|
||||||
|
<i class="ti ti-report-analytics"></i>
|
||||||
|
<span class="hide-menu">Data Rekap</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
{{-- MASTER --}}
|
||||||
|
@if(auth()->user()->akses && auth()->user()->akses->master_akses)
|
||||||
|
<li class="nav-small-cap"><span class="hide-menu">Master</span></li>
|
||||||
|
|
||||||
|
<li class="sidebar-item has-sub {{ $openMaster ? 'open' : '' }}">
|
||||||
|
<a class="sidebar-link d-flex align-items-center justify-content-between"
|
||||||
|
href="#menu-master"
|
||||||
|
data-bs-toggle="collapse"
|
||||||
|
role="button"
|
||||||
|
aria-expanded="{{ $openMaster ? 'true' : 'false' }}"
|
||||||
|
aria-controls="menu-master">
|
||||||
|
|
||||||
|
<div class="d-flex align-items-center gap-3">
|
||||||
|
<i class="ti ti-report-analytics"></i>
|
||||||
|
<span class="hide-menu">Master</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<i class="ti ti-chevron-right fs-6 sidebar-arrow"></i>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<ul class="collapse sidebar-submenu {{ $openMaster ? 'show' : '' }}" id="menu-master">
|
||||||
|
<li class="sidebar-item">
|
||||||
|
<a href="{{ url('/akses') }}" class="sidebar-link">
|
||||||
|
<span class="hide-menu">Akses</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="sidebar-item">
|
||||||
|
<a href="{{ url('/master-kategori') }}" class="sidebar-link">
|
||||||
|
<span class="hide-menu">Kategori</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="sidebar-item">
|
||||||
|
<a href="{{ url('/master-persetujuan') }}" class="sidebar-link">
|
||||||
|
<span class="hide-menu">Persetujuan</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
@endif
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</aside>
|
||||||
|
|
||||||
|
{{-- Styling kecil biar submenu rapi + arrow muter --}}
|
||||||
|
<style>
|
||||||
|
.sidebar-submenu { padding-left: 2.7rem; }
|
||||||
|
.sidebar-submenu .sidebar-link { padding: 6px 0; font-size: 13px; opacity: .9; }
|
||||||
|
|
||||||
|
.sidebar-item.has-sub .sidebar-arrow { transition: transform .2s ease; }
|
||||||
|
.sidebar-item.has-sub.open .sidebar-arrow { transform: rotate(90deg); }
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const badge = document.getElementById('pendingCountBadge');
|
||||||
|
|
||||||
|
async function countData() {
|
||||||
|
if (!badge) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch('/data/count-pending', {
|
||||||
|
headers: { 'Accept': 'application/json' }
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!res.ok) throw new Error('Request failed: ' + res.status);
|
||||||
|
|
||||||
|
const data = await res.json();
|
||||||
|
const count = Number(data?.count ?? 0);
|
||||||
|
|
||||||
|
badge.textContent = count;
|
||||||
|
badge.classList.toggle('d-none', count <= 0);
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
badge.classList.add('d-none');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
countData();
|
||||||
|
|
||||||
|
setInterval(countData, 60000);
|
||||||
|
|
||||||
|
const masterCollapse = document.getElementById('menu-master');
|
||||||
|
const masterItem = masterCollapse
|
||||||
|
? masterCollapse.closest('.sidebar-item.has-sub')
|
||||||
|
: null;
|
||||||
|
|
||||||
|
if (masterItem && masterCollapse) {
|
||||||
|
masterCollapse.addEventListener('shown.bs.collapse', function () {
|
||||||
|
masterItem.classList.add('open');
|
||||||
|
});
|
||||||
|
|
||||||
|
masterCollapse.addEventListener('hidden.bs.collapse', function () {
|
||||||
|
masterItem.classList.remove('open');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|||||||
@ -19,14 +19,18 @@ Route::middleware(['auth'])->group(function(){
|
|||||||
Route::post('/upload', [DashboardController::class, 'store']);
|
Route::post('/upload', [DashboardController::class, 'store']);
|
||||||
Route::get('/data-unit-kerja', [DashboardController::class, 'dataUnitKerja']);
|
Route::get('/data-unit-kerja', [DashboardController::class, 'dataUnitKerja']);
|
||||||
|
|
||||||
Route::resource('/master-kategori', MasterKategoriController::class);
|
|
||||||
Route::get('datatable/master-kategori', [MasterKategoriController::class, 'datatable']);
|
|
||||||
Route::resource('/master-klasifikasi', MasterKlasifikasiController::class);
|
|
||||||
Route::get('datatable/master-klasifikasi', [MasterKlasifikasiController::class, 'datatable']);
|
|
||||||
Route::resource('/akses', AksesFileController::class);
|
|
||||||
Route::get('datatable/akses', [AksesFileController::class, 'datatable']);
|
|
||||||
Route::get('/select-pegawai', [AksesFileController::class, 'optionPegawai']);
|
Route::get('/select-pegawai', [AksesFileController::class, 'optionPegawai']);
|
||||||
Route::get('/select-unit-kerja-option', [AksesFileController::class, 'optionUnitKerja']);
|
Route::get('/select-unit-kerja-option', [AksesFileController::class, 'optionUnitKerja']);
|
||||||
|
Route::middleware(['akses.master'])->group(function () {
|
||||||
|
Route::resource('/akses', AksesFileController::class);
|
||||||
|
Route::get('datatable/akses', [AksesFileController::class, 'datatable']);
|
||||||
|
Route::resource('/master-persetujuan', masterPersetujuanController::class)->only(['index','store','show','update','destroy']);
|
||||||
|
Route::get('datatable/master-persetujuan', [masterPersetujuanController::class, 'datatable']);
|
||||||
|
Route::resource('/master-kategori', MasterKategoriController::class);
|
||||||
|
Route::get('datatable/master-kategori', [MasterKategoriController::class, 'datatable']);
|
||||||
|
Route::resource('/master-klasifikasi', MasterKlasifikasiController::class);
|
||||||
|
Route::get('datatable/master-klasifikasi', [MasterKlasifikasiController::class, 'datatable']);
|
||||||
|
});
|
||||||
|
|
||||||
Route::get('/select-unit-kerja', [DashboardController::class, 'OptionUnitKerja']);
|
Route::get('/select-unit-kerja', [DashboardController::class, 'OptionUnitKerja']);
|
||||||
Route::get('/select-sub-unit-kerja/{id}', [DashboardController::class, 'optionSubUnitKerja']);
|
Route::get('/select-sub-unit-kerja/{id}', [DashboardController::class, 'optionSubUnitKerja']);
|
||||||
@ -42,14 +46,15 @@ Route::middleware(['auth'])->group(function(){
|
|||||||
Route::get('/recap', [DashboardController::class, 'recapView']);
|
Route::get('/recap', [DashboardController::class, 'recapView']);
|
||||||
Route::get('/data/recap', [DashboardController::class, 'recapData']);
|
Route::get('/data/recap', [DashboardController::class, 'recapData']);
|
||||||
|
|
||||||
Route::get('/pending-file', [DashboardController::class, 'pendingFile']);
|
|
||||||
Route::get('/datatable/pending-file', [DashboardController::class, 'dataPendingFile']);
|
|
||||||
Route::post('/pending-file/{id}/approve', [DashboardController::class, 'approvePendingFile']);
|
|
||||||
Route::post('/pending-file/{id}/reject', [DashboardController::class, 'rejectPendingFile']);
|
|
||||||
Route::get('/data/count-pending', [DashboardController::class, 'countDataPending']);
|
|
||||||
|
|
||||||
Route::resource('/master-persetujuan', masterPersetujuanController::class)->only(['index','store','show','update','destroy']);
|
|
||||||
Route::get('datatable/master-persetujuan', [masterPersetujuanController::class, 'datatable']);
|
Route::middleware(['master.persetujuan'])->group(function () {
|
||||||
|
Route::get('/pending-file', [DashboardController::class, 'pendingFile']);
|
||||||
|
Route::get('/datatable/pending-file', [DashboardController::class, 'dataPendingFile']);
|
||||||
|
Route::post('/pending-file/{id}/approve', [DashboardController::class, 'approvePendingFile']);
|
||||||
|
Route::post('/pending-file/{id}/reject', [DashboardController::class, 'rejectPendingFile']);
|
||||||
|
Route::get('/data/count-pending', [DashboardController::class, 'countDataPending']);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
Route::get('/login', [AuthController::class, 'index'])->name('login');
|
Route::get('/login', [AuthController::class, 'index'])->name('login');
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user