fix conflict

This commit is contained in:
arifal
2025-03-07 14:52:51 +07:00
40 changed files with 817 additions and 220 deletions

View File

@@ -31,6 +31,11 @@ class BusinessIndustries {
let tableContainer = document.getElementById(
"table-business-industries"
);
tableContainer.innerHTML = "";
let canUpdate = tableContainer.getAttribute("data-updater") === "1";
let canDelete = tableContainer.getAttribute("data-destroyer") === "1";
// Create a new Grid.js instance only if it doesn't exist
this.table = new Grid({
columns: [
@@ -50,17 +55,30 @@ class BusinessIndustries {
{ name: "Created", width: "180px" },
{
name: "Action",
formatter: (cell) =>
gridjs.html(`
<div class="d-flex justify-content-center gap-2">
<a href="/data/business-industries/${cell}/edit" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">
<i class='bx bx-edit'></i>
</a>
<button data-id="${cell}" class="btn btn-sm btn-red btn-delete-business-industry d-inline-flex align-items-center justify-content-center">
<i class='bx bxs-trash' ></i>
</button>
</div>
`),
formatter: (cell) => {
let buttons = `<div class="d-flex justify-content-center gap-2">`;
if (canUpdate) {
buttons += `
<a href="/data/business-industries/${cell}/edit" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">
<i class='bx bx-edit'></i>
</a>
`;
}
if (canDelete) {
buttons += `
<button data-id="${cell}" class="btn btn-sm btn-red btn-delete-business-industry d-inline-flex align-items-center justify-content-center">
<i class='bx bxs-trash'></i>
</button>
`;
}
buttons += `</div>`;
return gridjs.html(buttons);
},
},
],
pagination: {

View File

@@ -28,6 +28,10 @@ class Customers {
initTableCustomers() {
let tableContainer = document.getElementById("table-customers");
// Create a new Grid.js instance only if it doesn't exist
tableContainer.innerHTML = "";
let canUpdate = tableContainer.getAttribute("data-updater") === "1";
let canDelete = tableContainer.getAttribute("data-destroyer") === "1";
this.table = new Grid({
columns: [
"ID",
@@ -39,17 +43,31 @@ class Customers {
"Longitude",
{
name: "Action",
formatter: (cell) =>
gridjs.html(`
<div class="d-flex justify-content-center gap-2">
<a href="/data/customers/${cell}/edit" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">
<i class='bx bx-edit'></i>
</a>
<button data-id="${cell}" class="btn btn-sm btn-red btn-delete-customers d-inline-flex align-items-center justify-content-center">
<i class='bx bxs-trash' ></i>
</button>
</div>
`),
formatter: (cell) => {
let buttons = "";
if (canUpdate) {
buttons += `
<a href="/data/customers/${cell}/edit" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">
<i class='bx bx-edit'></i>
</a>
`;
}
if (canDelete) {
buttons += `
<button data-id="${cell}" class="btn btn-sm btn-red btn-delete-customers d-inline-flex align-items-center justify-content-center">
<i class='bx bxs-trash'></i>
</button>
`;
}
if (!canUpdate && !canDelete) {
buttons = `<span class="text-muted">No Privilege</span>`;
}
return gridjs.html(`<div class="d-flex justify-content-center gap-2">${buttons}</div>`);
},
},
],
pagination: {

View File

@@ -29,6 +29,10 @@ class DataSettings {
initTableDataSettings() {
let tableContainer = document.getElementById("table-data-settings");
tableContainer.innerHTML = "";
let canUpdate = tableContainer.getAttribute("data-updater") === "1";
let canDelete = tableContainer.getAttribute("data-destroyer") === "1"
// Create a new Grid.js instance only if it doesn't exist
this.table = new Grid({
columns: [
@@ -40,16 +44,29 @@ class DataSettings {
name: "Actions",
width: "120px",
formatter: function (cell) {
return gridjs.html(`
<div class="d-flex justify-content-center gap-2">
let buttons = "";
if (canUpdate) {
buttons += `
<a href="/data-settings/${cell}/edit" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">
<i class='bx bx-edit'></i>
</a>
<button class="btn btn-sm btn-red d-inline-flex align-items-center justify-content-center btn-delete-data-settings" data-id="${cell}">
<i class='bx bxs-trash' ></i>
`;
}
if (canDelete) {
buttons += `
<button class="btn btn-sm btn-red d-inline-flex align-items-center justify-content-center btn-delete-data-settings" data-id="${cell}">
<i class='bx bxs-trash'></i>
</button>
</div>
`);
`;
}
if (!canUpdate && !canDelete) {
buttons = `<span class="text-muted">No Privilege</span>`;
}
return gridjs.html(`<div class="d-flex justify-content-center gap-2">${buttons}</div>`);
},
},
],

View File

@@ -4,6 +4,11 @@ import "gridjs/dist/gridjs.umd.js";
import GlobalConfig from "../../global-config.js";
import GeneralTable from "../../table-generator.js";
// Ambil hak akses dari data-attribute
const tableElement = document.getElementById("reklame-data-table");
const canUpdate = tableElement.getAttribute("data-updater") === "1";
const canDelete = tableElement.getAttribute("data-destroyer") === "1";
const dataAdvertisementsColumns = [
"No",
"Nama Wajib Pajak",
@@ -17,21 +22,39 @@ const dataAdvertisementsColumns = [
"Kontak",
{
name: "Actions",
widht: "120px",
width: "120px",
formatter: function(cell, row) {
const id = row.cells[10].data;
const model = "data/advertisements";
return gridjs.html(`
<div class="d-flex justify-items-end gap-10">
let actionButtons = '<div class="d-flex justify-items-end gap-10">';
let hasPrivilege = false;
// Tampilkan tombol Edit jika user punya akses update
if (canUpdate) {
hasPrivilege = true;
actionButtons += `
<button class="btn btn-warning me-2 btn-edit"
data-id="${id}"
data-model="${model}">
<i class='bx bx-edit' ></i></button>
<i class='bx bx-edit'></i>
</button>`;
}
// Tampilkan tombol Delete jika user punya akses delete
if (canDelete) {
hasPrivilege = true;
actionButtons += `
<button class="btn btn-red btn-delete"
data-id="${id}">
<i class='bx bxs-trash' ></i></button>
</div>
`);
data-id="${id}">
<i class='bx bxs-trash'></i>
</button>`;
}
actionButtons += '</div>';
// Jika tidak memiliki akses, tampilkan teks "No Privilege"
return gridjs.html(hasPrivilege ? actionButtons : '<span class="text-muted">No Privilege</span>');
}
}
];

View File

@@ -4,6 +4,11 @@ import "gridjs/dist/gridjs.umd.js";
import GlobalConfig from "../../global-config.js";
import GeneralTable from "../../table-generator.js";
// Ambil hak akses dari data-attribute
const tableElement = document.getElementById("spatial-planning-data-table");
const canUpdate = tableElement.getAttribute("data-updater") === "1";
const canDelete = tableElement.getAttribute("data-destroyer") === "1";
const dataSpatialPlanningColumns = [
"No",
"Nama",
@@ -19,18 +24,35 @@ const dataSpatialPlanningColumns = [
formatter: function (cell, row) {
const id = row.cells[8].data;
const model = "data/spatial-plannings";
return gridjs.html(`
<div class="d-flex justify-items-end gap-10">
let actionButtons = '<div class="d-flex justify-items-end gap-10">';
let hasPrivilege = false;
// Tampilkan tombol Edit jika user punya akses update
if (canUpdate) {
hasPrivilege = true;
actionButtons += `
<button class="btn btn-warning me-2 btn-edit"
data-id="${id}"
data-model="${model}">
<i class='bx bx-edit'></i></button>
<i class='bx bx-edit'></i>
</button>`;
}
// Tampilkan tombol Delete jika user punya akses delete
if (canDelete) {
hasPrivilege = true;
actionButtons += `
<button class="btn btn-red btn-delete"
data-id="${id}">
<i class='bx bxs-trash'></i></button>
</div>
`);
<i class='bx bxs-trash'></i>
</button>`;
}
actionButtons += '</div>';
// Jika tidak memiliki akses, tampilkan teks "No Privilege"
return gridjs.html(hasPrivilege ? actionButtons : '<span class="text-muted">No Privilege</span>');
},
},
];

View File

@@ -3,6 +3,14 @@ import gridjs from "gridjs/dist/gridjs.umd.js";
import "gridjs/dist/gridjs.umd.js";
import GlobalConfig from "../../global-config.js";
import GeneralTable from "../../table-generator.js";
import L from "leaflet";
import "leaflet/dist/leaflet.css";
// Ambil hak akses dari data-attribute
const tableElement = document.getElementById("tourisms-data-table");
const canView = "1";
const canUpdate = tableElement.getAttribute("data-updater") === "1";
const canDelete = tableElement.getAttribute("data-destroyer") === "1";
const dataTourismsColumns = [
"No",
@@ -21,26 +29,49 @@ const dataTourismsColumns = [
widht: "120px",
formatter: function (cell, row) {
const id = row.cells[11].data;
const district = row.cells[4].data;
const long = row.cells[9].data;
const lat = row.cells[10].data;
const model = "data/tourisms";
return gridjs.html(`
<div class="d-flex justify-items-end gap-10">
<button class="btn btn-warning me-2 btn-edit"
data-id="${id}"
data-model="${model}">
<i class='bx bx-edit'></i></button>
<button class="btn btn-info me-2 btn-view"
data-long="${long}" data-lat="${lat}">
<i class='bx bx-map'></i></button>
let actionButtons = '<div class="d-flex justify-items-end gap-10">';
let hasPrivilege = false;
// Tampilkan tombol View jika user punya akses view
if (canView) {
hasPrivilege = true;
actionButtons += `
<button class="btn btn-info me-2 btn-view"
data-long="${long}" data-lat="${lat}" data-district="${district}">
<i class='bx bx-map'></i>
</button>`
}
// Tampilkan tombol Edit jika user punya akses update
if (canUpdate) {
hasPrivilege = true;
actionButtons += `
<button class="btn btn-warning me-2 btn-edit"
data-id="${id}"
data-model="${model}">
<i class='bx bx-edit'></i>
</button>`;
}
// Tampilkan tombol Delete jika user punya akses delete
if (canDelete) {
hasPrivilege = true;
actionButtons += `
<button class="btn btn-red btn-delete"
data-id="${id}">
<i class='bx bxs-trash'></i></button>
</div>
`);
},
<i class='bx bxs-trash'></i>
</button>`
}
actionButtons += '</div>';
// Jika tidak memiliki akses, tampilkan teks "No Privilege"
return gridjs.html(hasPrivilege ? actionButtons : '<span class="text-muted">No Privilege</span>');
}
},
];
@@ -74,24 +105,117 @@ document.addEventListener("DOMContentLoaded", () => {
table.init();
// Event listener untuk tombol "View" yang memunculkan modal
// document.addEventListener("click", function (e) {
// if (e.target && e.target.classList.contains("btn-view")) {
// const long = e.target.getAttribute("data-long");
// const lat = e.target.getAttribute("data-lat");
// // Menyiapkan URL iframe dengan koordinat yang didapatkan
// const iframeSrc = `https://www.google.com/maps?q=${lat},${long}&hl=es;z=14&output=embed`;
// // Menemukan modal dan iframe di dalam modal
// const modal = document.querySelector(".modalGMaps");
// const iframe = modal.querySelector("iframe");
// // Set src iframe untuk menampilkan peta dengan koordinat yang relevan
// iframe.src = iframeSrc;
// // Menampilkan modal
// var modalInstance = new bootstrap.Modal(modal);
// modalInstance.show();
// }
// });
let map;
let geoLayer;
// Event listener untuk tombol "View" yang memunculkan modal dengan Leaflet
document.addEventListener("click", function (e) {
if (e.target && e.target.classList.contains("btn-view")) {
const long = e.target.getAttribute("data-long");
const lat = e.target.getAttribute("data-lat");
const long = parseFloat(e.target.getAttribute("data-long"));
const lat = parseFloat(e.target.getAttribute("data-lat"));
const district = e.target.getAttribute("data-district");
// Menyiapkan URL iframe dengan koordinat yang didapatkan
const iframeSrc = `https://www.google.com/maps?q=${lat},${long}&hl=es;z=14&output=embed`;
// Menemukan modal dan iframe di dalam modal
const modal = document.querySelector(".modalGMaps");
const iframe = modal.querySelector("iframe");
// Set src iframe untuk menampilkan peta dengan koordinat yang relevan
iframe.src = iframeSrc;
// Menampilkan modal
var modalInstance = new bootstrap.Modal(modal);
modalInstance.show();
setTimeout(() => {
if (!map) {
map = L.map("map").setView([lat, long], 14);
// Tambahkan tile layer (peta dasar)
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
attribution: '&copy; OpenStreetMap contributors'
}).addTo(map);
} else {
map.setView([lat, long], 14);
}
if (geoLayer) {
map.removeLayer(geoLayer);
}
// Tambahkan marker untuk lokasi
L.marker([lat, long]).addTo(map)
.bindPopup(`<b>${district}</b><br>Lat: ${lat}, Long: ${long}`)
.openPopup();
// Tambahkan GeoJSON ke dalam peta
fetch(`/storage/maps/tourisms/${district.toUpperCase()}.json`)
.then((res) => res.json())
.then((geojson) => {
let colorMapping = {
BJ: "rgb(235, 30, 30)",
BA: "rgb(151, 219, 242)",
CA: "rgb(70, 70, 165)",
"P-2": "rgb(230, 255, 75)",
HL: "rgb(50, 95, 40)",
HPT: "rgb(75, 155, 55)",
HP: "rgb(125, 180, 55)",
W: "rgb(255, 165, 255)",
PTL: "rgb(0, 255, 205)",
"IK-2": "rgb(130, 185, 210)",
"P-3": "rgb(175, 175, 55)",
PS: "rgb(5, 215, 215)",
PD: "rgb(235, 155, 60)",
PK: "rgb(245, 155, 30)",
HK: "rgb(155, 0, 255)",
KPI: "rgb(105, 0, 0)",
MBT: "rgb(95, 115, 145)",
"P-4": "rgb(185, 235, 185)",
TB: "rgb(70, 150, 255)",
"P-1": "rgb(200, 245, 70)",
TR: "rgb(215, 55, 0)",
THR: "rgb(185, 165, 255)",
TWA: "rgb(210, 190, 255)",
};
var geoLayer = L.geoJSON(geojson, {
style: function (feature) {
let htmlString = feature.properties.description.toString();
let match = htmlString.match(
/<td>Kode Zona<\/td>\s*<td>(.*?)<\/td>/
);
let color_code = match[1];
return {
color: colorMapping[color_code],
fillColor: colorMapping[color_code] || "#cccccc",
fillOpacity: 0.6,
weight: 1.5,
};
},
onEachFeature: function(feature, layer) {
if (feature.properties && feature.properties.name) {
layer.bindPopup(feature.properties.name);
}
},
}).addTo(map);
map.fitBounds(geoLayer.getBounds());
})
.catch((error) => {
console.error("Error loading GeoJSON:", error);
});
}, 500);
}
});
});

View File

@@ -3,6 +3,11 @@ import "gridjs/dist/gridjs.umd.js";
import GlobalConfig from "../../global-config.js";
import GeneralTable from "../../table-generator.js";
// Ambil hak akses dari data-attribute
const tableElement = document.getElementById("umkm-data-table");
const canUpdate = tableElement.getAttribute("data-updater") === "1";
const canDelete = tableElement.getAttribute("data-destroyer") === "1";
const dataUMKMColumns = [
"No",
"Nama Usaha",
@@ -29,17 +34,35 @@ const dataUMKMColumns = [
formatter: function(cell, row) {
const id = row.cells[19].data;
const model = "data/umkm";
return gridjs.html(`
<div class="d-flex justify-items-end gap-10">
let actionButtons = '<div class="d-flex justify-items-end gap-10">';
let hasPrivilege = false;
// Tampilkan tombol Edit jika user punya akses update
if (canUpdate) {
hasPrivilege = true;
actionButtons += `
<button class="btn btn-warning me-2 btn-edit"
data-id="${id}"
data-model="${model}">
<i class='bx bx-edit' ></i></button>
<i class='bx bx-edit'></i>
</button>`;
}
// Tampilkan tombol Delete jika user punya akses delete
if (canDelete) {
hasPrivilege = true;
actionButtons += `
<button class="btn btn-red btn-delete"
data-id="${id}">
<i class='bx bxs-trash' ></i></button>
</div>
`);
data-id="${id}">
<i class='bx bxs-trash'></i>
</button>`;
}
actionButtons += '</div>';
// Jika tidak memiliki akses, tampilkan teks "No Privilege"
return gridjs.html(hasPrivilege ? actionButtons : '<span class="text-muted">No Privilege</span>');
}
}
];

View File

@@ -9,6 +9,12 @@ class UsersTable {
}
initTableUsers() {
let tableContainer = document.getElementById(
"table-users"
);
tableContainer.innerHTML = "";
let canUpdate = tableContainer.getAttribute("data-updater") === "1";
new Grid({
columns: [
"ID",
@@ -20,14 +26,18 @@ class UsersTable {
"Roles",
{
name: "Action",
formatter: (cell) =>
gridjs.html(`
formatter: (cell) =>{
if (!canUpdate) {
return gridjs.html(`<span class="text-muted">No Privilege</span>`);
}
return gridjs.html(`
<div class="d-flex justify-content-center">
<a href="/master/users/${cell}/edit" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">
<i class='bx bx-edit'></i>
</a>
</div>
`),
`);
},
},
],
pagination: {

View File

@@ -28,35 +28,9 @@ class Menus {
initTableMenus() {
let tableContainer = document.getElementById("table-menus");
// if (this.table) {
// // If table exists, update its data instead of recreating
// this.table
// .updateConfig({
// server: {
// url: `${GlobalConfig.apiHost}/api/menus`,
// credentials: "include",
// headers: {
// Authorization: `Bearer ${document
// .querySelector('meta[name="api-token"]')
// .getAttribute("content")}`,
// "Content-Type": "application/json",
// },
// then: (data) =>
// data.data.map((item) => [
// item.id,
// item.name,
// item.url,
// item.icon,
// item.parent_id,
// item.sort_order,
// item.id,
// ]),
// total: (data) => data.total,
// },
// })
// .forceRender();
// return;
// }
tableContainer.innerHTML = "";
let canUpdate = tableContainer.getAttribute("data-updater") === "1";
let canDelete = tableContainer.getAttribute("data-destroyer") === "1";
this.table = new Grid({
columns: [
@@ -68,18 +42,33 @@ class Menus {
"Sort Order",
{
name: "Action",
formatter: (cell) =>
gridjs.html(`
<div class="d-flex justify-content-center align-items-center gap-2">
<a href="/menus/${cell}/edit" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">
<i class='bx bx-edit'></i>
</a>
<button data-id="${cell}"
class="btn btn-red btn-sm btn-delete-menu d-inline-flex align-items-center justify-content-center">
<i class='bx bxs-trash' ></i>
</button>
</div>
`),
formatter: (cell) => {
let buttons = `<div class="d-flex justify-content-center align-items-center gap-2">`;
if (canUpdate) {
buttons += `
<a href="/menus/${cell}/edit" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">
<i class='bx bx-edit'></i>
</a>
`;
}
if (canDelete) {
buttons += `
<button data-id="${cell}" class="btn btn-red btn-sm btn-delete-menu d-inline-flex align-items-center justify-content-center">
<i class='bx bxs-trash'></i>
</button>
`;
}
if (!canUpdate && !canDelete) {
buttons += `<span class="text-muted">No Privilege</span>`;
}
buttons += `</div>`;
return gridjs.html(buttons);
},
},
],
pagination: {

View File

@@ -9,6 +9,11 @@ class PbgTasks {
}
initTableRequestAssignment() {
let tableContainer = document.getElementById("table-pbg-tasks");
// Pastikan kontainer kosong sebelum merender ulang Grid.js
tableContainer.innerHTML = "";
let canUpdate = tableContainer.getAttribute("data-updater") === "1";
new Grid({
columns: [
"ID",
@@ -24,13 +29,24 @@ class PbgTasks {
{
name: "Action",
formatter: function (cell) {
let tableContainer = document.getElementById("table-pbg-tasks");
let canUpdate = tableContainer.getAttribute("data-updater") === "1";
if (!canUpdate) {
return gridjs.html(`
<span class="text-muted">No Privilege</span>
`);
}
return gridjs.html(`
<div class="d-flex justify-content-center align-items-center gap-2">
<a href="/pbg-task/${cell}" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">Detail</a
<a href="/pbg-task/${cell}" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">
Detail
</a>
</div>
`);
},
},
}
],
search: {
server: {

View File

@@ -27,6 +27,10 @@ class Roles {
initTableRoles() {
let tableContainer = document.getElementById("table-roles");
tableContainer.innerHTML = "";
let canUpdate = tableContainer.getAttribute("data-updater") === "1";
let canDelete = tableContainer.getAttribute("data-destroyer") === "1";
// Create a new Grid.js instance only if it doesn't exist
this.table = new gridjs.Grid({
columns: [
@@ -34,22 +38,38 @@ class Roles {
"Name",
"Description",
{
name: "Action",
formatter: (cell) =>
gridjs.html(`
<div class="d-flex justify-content-center gap-2">
<a href="/roles/${cell}/edit" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">
<i class='bx bx-edit'></i>
</a>
<a href="/roles/role-menu/${cell}" class="btn btn-primary btn-sm d-inline-flex align-items-center justify-content-center">
Role Menu
</a>
<button data-id="${cell}" class="btn btn-sm btn-red btn-delete-role d-inline-flex align-items-center justify-content-center">
<i class='bx bxs-trash' ></i>
</button>
</div>
`),
name: "Action",
formatter: (cell) => {
let buttons = `<div class="d-flex justify-content-center gap-2">`;
if (canUpdate) {
buttons += `
<a href="/roles/${cell}/edit" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">
<i class='bx bx-edit'></i>
</a>
<a href="/roles/role-menu/${cell}" class="btn btn-primary btn-sm d-inline-flex align-items-center justify-content-center">
Role Menu
</a>
`;
}
if (canDelete) {
buttons += `
<button data-id="${cell}" class="btn btn-sm btn-red btn-delete-role d-inline-flex align-items-center justify-content-center">
<i class='bx bxs-trash'></i>
</button>
`;
}
if (!canUpdate && !canDelete) {
buttons += `<span class="text-muted">No Privilege</span>`;
}
buttons += `</div>`;
return gridjs.html(buttons);
},
},
],
pagination: {
limit: 50,

View File

@@ -12,6 +12,11 @@ class GeneralTable {
}
init() {
const tableContainer = document.getElementById(this.tableId);
// Kosongkan container sebelum render ulang
tableContainer.innerHTML = "";
const table = new Grid({
columns: this.columns,
search: this.options.search || {
@@ -42,8 +47,8 @@ class GeneralTable {
total: (data) => data.meta.total,
},
});
table.render(document.getElementById(this.tableId));
table.render(tableContainer);
this.handleActions();
}