fix pdam redirect back and advertisement partial update redirect

This commit is contained in:
arifal
2025-03-13 13:57:53 +07:00
parent e5db2294b4
commit e47ab36d5e
14 changed files with 72 additions and 78 deletions

View File

@@ -11,38 +11,27 @@ class CustomersController extends Controller
{ {
public function index(Request $request) public function index(Request $request)
{ {
$menuId = $request->query('menu_id'); $menuId = $request->query('menu_id') ?? $request->input('menu_id');
$user = Auth::user(); $permissions = $this->permissions[$menuId]?? []; // Avoid undefined index error
$userId = $user->id; $creator = $permissions['allow_create'] ?? 0;
$updater = $permissions['allow_update'] ?? 0;
$destroyer = $permissions['allow_destroy'] ?? 0;
// Ambil role_id yang dimiliki user return view('customers.index', compact('creator', 'updater', 'destroyer', 'menuId'));
$roleIds = DB::table('user_role')
->where('user_id', $userId)
->pluck('role_id');
// Ambil data akses berdasarkan role_id dan menu_id
$roleAccess = DB::table('role_menu')
->whereIn('role_id', $roleIds)
->where('menu_id', $menuId)
->first();
// Pastikan roleAccess tidak null sebelum mengakses properti
$creator = $roleAccess->allow_create ?? 0;
$updater = $roleAccess->allow_update ?? 0;
$destroyer = $roleAccess->allow_destroy ?? 0;
return view('customers.index', compact('creator', 'updater', 'destroyer'));
} }
public function create() public function create(Request $request)
{ {
return view('customers.create'); $menuId = $request->query('menu_id');
return view('customers.create', compact('menuId'));
} }
public function edit(string $id) public function edit(Request $request, string $id)
{ {
$data = Customer::findOrFail($id); $data = Customer::findOrFail($id);
return view('customers.edit', compact('data')); $menuId = $request->query('menu_id');
return view('customers.edit', compact('data', 'menuId'));
} }
public function upload(){ public function upload(Request $request){
return view('customers.upload'); $menuId = $request->query('menu_id');
return view('customers.upload', compact('menuId'));
} }
} }

View File

@@ -15,27 +15,14 @@ class AdvertisementController extends Controller
*/ */
public function index(Request $request) public function index(Request $request)
{ {
$menuId = $request->query('menu_id'); $menuId = (int) $request->query('menu_id', 0);
$user = Auth::user(); $permissions = $this->permissions[$menuId] ?? []; // Avoid undefined index error
$userId = $user->id;
// Ambil role_id yang dimiliki user $creator = $permissions['allow_create'] ?? 0;
$roleIds = DB::table('user_role') $updater = $permissions['allow_update'] ?? 0;
->where('user_id', $userId) $destroyer = $permissions['allow_destroy'] ?? 0;
->pluck('role_id');
// Ambil data akses berdasarkan role_id dan menu_id return view('data.advertisements.index', compact('creator', 'updater', 'destroyer','menuId'));
$roleAccess = DB::table('role_menu')
->whereIn('role_id', $roleIds)
->where('menu_id', $menuId)
->first();
// Pastikan roleAccess tidak null sebelum mengakses properti
$creator = $roleAccess->allow_create ?? 0;
$updater = $roleAccess->allow_update ?? 0;
$destroyer = $roleAccess->allow_destroy ?? 0;
return view('data.advertisements.index', compact('creator', 'updater', 'destroyer'));
} }
/** /**
@@ -50,8 +37,9 @@ class AdvertisementController extends Controller
/** /**
* Show the form for creating a new resource. * Show the form for creating a new resource.
*/ */
public function create() public function create(Request $request)
{ {
$menuId = (int) $request->query('menu_id', 0);
$title = 'Advertisement'; $title = 'Advertisement';
$subtitle = 'Create Data'; $subtitle = 'Create Data';
@@ -68,14 +56,15 @@ class AdvertisementController extends Controller
// $route = 'advertisements.create'; // $route = 'advertisements.create';
// info("AdvertisementController@edit diakses dengan ID: $title"); // info("AdvertisementController@edit diakses dengan ID: $title");
return view('data.advertisements.form', compact('title', 'subtitle', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions')); return view('data.advertisements.form', compact('title', 'subtitle', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions','menuId'));
} }
/** /**
* Show the form for editing the specified resource. * Show the form for editing the specified resource.
*/ */
public function edit($id) public function edit(Request $request, $id)
{ {
$menuId = (int) $request->query('menu_id', 0);
info("AdvertisementController@edit diakses dengan ID: $id"); info("AdvertisementController@edit diakses dengan ID: $id");
$title = 'Advertisement'; $title = 'Advertisement';
$subtitle = 'Update Data'; $subtitle = 'Update Data';
@@ -107,7 +96,7 @@ class AdvertisementController extends Controller
// $route = 'advertisements.update'; // Menggunakan route update untuk form edit // $route = 'advertisements.update'; // Menggunakan route update untuk form edit
// info("AdvertisementController@edit diakses dengan route: $route"); // info("AdvertisementController@edit diakses dengan route: $route");
return view('data.advertisements.form', compact('title', 'subtitle', 'modelInstance', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions')); return view('data.advertisements.form', compact('title', 'subtitle', 'modelInstance', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions', 'menuId'));
} }
private function getFields() private function getFields()

View File

@@ -6,6 +6,7 @@ class CreateCustomer {
initCreateCustomer() { initCreateCustomer() {
const toastNotification = document.getElementById("toastNotification"); const toastNotification = document.getElementById("toastNotification");
const toast = new bootstrap.Toast(toastNotification); const toast = new bootstrap.Toast(toastNotification);
let menuId = document.getElementById("menuId").value;
document document
.getElementById("btnCreateCustomer") .getElementById("btnCreateCustomer")
.addEventListener("click", async function () { .addEventListener("click", async function () {
@@ -41,7 +42,7 @@ class CreateCustomer {
result.message; result.message;
toast.show(); toast.show();
setTimeout(() => { setTimeout(() => {
window.location.href = "/data/customers"; window.location.href = `/data/customers?menu_id=${menuId}`;
}, 2000); }, 2000);
} else { } else {
let error = await response.json(); let error = await response.json();

View File

@@ -6,6 +6,7 @@ class UpdateCustomer {
initUpdateCustomer() { initUpdateCustomer() {
const toastNotification = document.getElementById("toastNotification"); const toastNotification = document.getElementById("toastNotification");
const toast = new bootstrap.Toast(toastNotification); const toast = new bootstrap.Toast(toastNotification);
let menuId = document.getElementById("menuId").value;
document document
.getElementById("btnUpdateCustomer") .getElementById("btnUpdateCustomer")
.addEventListener("click", async function () { .addEventListener("click", async function () {
@@ -41,7 +42,7 @@ class UpdateCustomer {
result.message; result.message;
toast.show(); toast.show();
setTimeout(() => { setTimeout(() => {
window.location.href = "/data/customers"; window.location.href = `/data/customers?menu_id=${menuId}`;
}, 2000); }, 2000);
} else { } else {
let error = await response.json(); let error = await response.json();

View File

@@ -32,6 +32,7 @@ class Customers {
tableContainer.innerHTML = ""; tableContainer.innerHTML = "";
let canUpdate = tableContainer.getAttribute("data-updater") === "1"; let canUpdate = tableContainer.getAttribute("data-updater") === "1";
let canDelete = tableContainer.getAttribute("data-destroyer") === "1"; let canDelete = tableContainer.getAttribute("data-destroyer") === "1";
let menuId = tableContainer.getAttribute("data-menuId");
this.table = new Grid({ this.table = new Grid({
columns: [ columns: [
"ID", "ID",
@@ -45,15 +46,15 @@ class Customers {
name: "Action", name: "Action",
formatter: (cell) => { formatter: (cell) => {
let buttons = ""; let buttons = "";
if (canUpdate) { if (canUpdate) {
buttons += ` buttons += `
<a href="/data/customers/${cell}/edit" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center"> <a href="/data/customers/${cell}/edit?menu_id=${menuId}" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">
<i class='bx bx-edit'></i> <i class='bx bx-edit'></i>
</a> </a>
`; `;
} }
if (canDelete) { if (canDelete) {
buttons += ` buttons += `
<button data-id="${cell}" class="btn btn-sm btn-red btn-delete-customers d-inline-flex align-items-center justify-content-center"> <button data-id="${cell}" class="btn btn-sm btn-red btn-delete-customers d-inline-flex align-items-center justify-content-center">
@@ -61,12 +62,14 @@ class Customers {
</button> </button>
`; `;
} }
if (!canUpdate && !canDelete) { if (!canUpdate && !canDelete) {
buttons = `<span class="text-muted">No Privilege</span>`; buttons = `<span class="text-muted">No Privilege</span>`;
} }
return gridjs.html(`<div class="d-flex justify-content-center gap-2">${buttons}</div>`); return gridjs.html(
`<div class="d-flex justify-content-center gap-2">${buttons}</div>`
);
}, },
}, },
], ],

View File

@@ -20,6 +20,7 @@ class UploadCustomers {
initDropzone() { initDropzone() {
const toastNotification = document.getElementById("toastNotification"); const toastNotification = document.getElementById("toastNotification");
const toast = new bootstrap.Toast(toastNotification); const toast = new bootstrap.Toast(toastNotification);
let menuId = document.getElementById("menuId").value;
var previewTemplate, var previewTemplate,
dropzonePreviewNode = document.querySelector( dropzonePreviewNode = document.querySelector(
"#dropzone-preview-list" "#dropzone-preview-list"
@@ -46,7 +47,7 @@ class UploadCustomers {
response.message; response.message;
toast.show(); toast.show();
setTimeout(() => { setTimeout(() => {
window.location.href = "/data/customers"; window.location.href = `/data/customers?menu_id=${menuId}`;
}, 2000); }, 2000);
}); });
this.on("error", function (file, errorMessage) { this.on("error", function (file, errorMessage) {

View File

@@ -8,6 +8,7 @@ import GeneralTable from "../../table-generator.js";
const tableElement = document.getElementById("reklame-data-table"); const tableElement = document.getElementById("reklame-data-table");
const canUpdate = tableElement.getAttribute("data-updater") === "1"; const canUpdate = tableElement.getAttribute("data-updater") === "1";
const canDelete = tableElement.getAttribute("data-destroyer") === "1"; const canDelete = tableElement.getAttribute("data-destroyer") === "1";
let menuId = document.getElementById("menuId").value;
const dataAdvertisementsColumns = [ const dataAdvertisementsColumns = [
"No", "No",
@@ -23,13 +24,13 @@ const dataAdvertisementsColumns = [
{ {
name: "Actions", name: "Actions",
width: "120px", width: "120px",
formatter: function(cell, row) { formatter: function (cell, row) {
const id = row.cells[10].data; const id = row.cells[10].data;
const model = "data/advertisements"; const model = `data/web-advertisements`;
let actionButtons = '<div class="d-flex justify-items-end gap-10">'; let actionButtons = '<div class="d-flex justify-items-end gap-10">';
let hasPrivilege = false; let hasPrivilege = false;
// Tampilkan tombol Edit jika user punya akses update // Tampilkan tombol Edit jika user punya akses update
if (canUpdate) { if (canUpdate) {
hasPrivilege = true; hasPrivilege = true;
@@ -40,7 +41,7 @@ const dataAdvertisementsColumns = [
<i class='bx bx-edit'></i> <i class='bx bx-edit'></i>
</button>`; </button>`;
} }
// Tampilkan tombol Delete jika user punya akses delete // Tampilkan tombol Delete jika user punya akses delete
if (canDelete) { if (canDelete) {
hasPrivilege = true; hasPrivilege = true;
@@ -50,13 +51,17 @@ const dataAdvertisementsColumns = [
<i class='bx bxs-trash'></i> <i class='bx bxs-trash'></i>
</button>`; </button>`;
} }
actionButtons += '</div>'; actionButtons += "</div>";
// Jika tidak memiliki akses, tampilkan teks "No Privilege" // Jika tidak memiliki akses, tampilkan teks "No Privilege"
return gridjs.html(hasPrivilege ? actionButtons : '<span class="text-muted">No Privilege</span>'); return gridjs.html(
} hasPrivilege
} ? actionButtons
: '<span class="text-muted">No Privilege</span>'
);
},
},
]; ];
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
@@ -86,4 +91,4 @@ document.addEventListener("DOMContentLoaded", () => {
}; };
table.init(); table.init();
}); });

View File

@@ -5,6 +5,7 @@ document.addEventListener("DOMContentLoaded", function () {
const modalButton = document.querySelector(".btn-modal"); const modalButton = document.querySelector(".btn-modal");
const form = document.querySelector("form#create-update-form"); const form = document.querySelector("form#create-update-form");
var authLogo = document.querySelector(".auth-logo"); var authLogo = document.querySelector(".auth-logo");
let menuId = document.getElementById("menuId").value;
if (!saveButton || !form) return; if (!saveButton || !form) return;
@@ -73,7 +74,7 @@ document.addEventListener("DOMContentLoaded", function () {
}, 2000); }, 2000);
setTimeout(() => { setTimeout(() => {
window.location.href = "/data/web-advertisements"; window.location.href = `/data/web-advertisements?menu_id=${menuId}`;
}, 1000); }, 1000);
} else { } else {
if (authLogo) { if (authLogo) {

View File

@@ -5,11 +5,12 @@
@include('layouts.partials/page-title', ['title' => 'Data', 'subtitle' => 'PDAM']) @include('layouts.partials/page-title', ['title' => 'Data', 'subtitle' => 'PDAM'])
<x-toast-notification /> <x-toast-notification />
<input type="hidden" id="menuId" value="{{ $menuId ?? 0 }}">
<div class="row d-flex justify-content-center"> <div class="row d-flex justify-content-center">
<div class="col-md-6"> <div class="col-md-6">
<div class="card"> <div class="card">
<div class="card-header d-flex justify-content-end"> <div class="card-header d-flex justify-content-end">
<a href="{{ route('customers') }}" class="btn btn-sm btn-secondary">Back</a> <a href="{{ route('customers', ['menu_id' => $menuId]) }}" class="btn btn-sm btn-secondary">Back</a>
</div> </div>
<div class="card-body"> <div class="card-body">
<form id="formCreateCustomer" action="{{ route('api.customers.store') }}" method="post"> <form id="formCreateCustomer" action="{{ route('api.customers.store') }}" method="post">

View File

@@ -5,11 +5,12 @@
@include('layouts.partials/page-title', ['title' => 'Data', 'subtitle' => 'PDAM']) @include('layouts.partials/page-title', ['title' => 'Data', 'subtitle' => 'PDAM'])
<x-toast-notification /> <x-toast-notification />
<input type="hidden" id="menuId" value="{{ $menuId ?? 0 }}">
<div class="row d-flex justify-content-center"> <div class="row d-flex justify-content-center">
<div class="col-md-6"> <div class="col-md-6">
<div class="card"> <div class="card">
<div class="card-header d-flex justify-content-end"> <div class="card-header d-flex justify-content-end">
<a href="{{ route('customers') }}" class="btn btn-sm btn-secondary">Back</a> <a href="{{ route('customers', ['menu_id' => $menuId]) }}" class="btn btn-sm btn-secondary">Back</a>
</div> </div>
<div class="card-body"> <div class="card-body">
<form id="formUpdateCustomer" action="{{ route('api.customers.update', $data->id) }}" method="post"> <form id="formUpdateCustomer" action="{{ route('api.customers.update', $data->id) }}" method="post">

View File

@@ -16,13 +16,14 @@
<div class="card-body"> <div class="card-body">
<div class="d-flex flex-wrap justify-content-end align-items-center mb-2"> <div class="d-flex flex-wrap justify-content-end align-items-center mb-2">
@if ($creator) @if ($creator)
<a href="{{ route('customers.create')}}" class="btn btn-success btn-sm d-block d-sm-inline w-auto me-3">Create</a> <a href="{{ route('customers.create', ['menu_id' => $menuId]) }}" class="btn btn-success btn-sm d-block d-sm-inline w-auto me-3">Create</a>
<a href="{{ route('customers.upload')}}" class="btn btn-success btn-sm d-block d-sm-inline w-auto">Upload</a> <a href="{{ route('customers.upload', ['menu_id' => $menuId]) }}" class="btn btn-success btn-sm d-block d-sm-inline w-auto">Upload</a>
@endif @endif
</div> </div>
<div id="table-customers" <div id="table-customers"
data-updater="{{ $updater }}" data-updater="{{ $updater }}"
data-destroyer="{{ $destroyer }}"> data-destroyer="{{ $destroyer }}"
data-menuId="{{ $menuId }}">
</div> </div>
</div> </div>
</div> </div>

View File

@@ -5,6 +5,7 @@
@include('layouts.partials/page-title', ['title' => 'Data', 'subtitle' => 'PDAM']) @include('layouts.partials/page-title', ['title' => 'Data', 'subtitle' => 'PDAM'])
<x-toast-notification /> <x-toast-notification />
<input type="hidden" id="menuId" value="{{ $menuId ?? 0 }}">
<div class="row"> <div class="row">
<div class="col-xl-12"> <div class="col-xl-12">
<div class="card"> <div class="card">

View File

@@ -3,7 +3,7 @@
@section('content') @section('content')
@include('layouts.partials/page-title', ['title' => $title, 'subtitle' => $subtitle]) <!-- Menggunakan title dan subtitle dari controller --> @include('layouts.partials/page-title', ['title' => $title, 'subtitle' => $subtitle]) <!-- Menggunakan title dan subtitle dari controller -->
<input type="hidden" id="menuId" value="{{ $menuId ?? 0 }}">
<div class="row d-flex justify-content-center"> <div class="row d-flex justify-content-center">
@if (session('error')) @if (session('error'))
<div class="alert alert-danger"> <div class="alert alert-danger">

View File

@@ -8,7 +8,7 @@
@include('layouts.partials/page-title', ['title' => 'Data', 'subtitle' => 'Reklame']) @include('layouts.partials/page-title', ['title' => 'Data', 'subtitle' => 'Reklame'])
<input type="hidden" id="menuId" value="{{ $menuId ?? 0 }}">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h5 class="card-title">Daftar Reklame</h5> <h5 class="card-title">Daftar Reklame</h5>