// variables part
var supervisorCartable;
var supervisorCartable_url = "/v2/road_observations/supervisor/cartable/show";
var verify_api = "/v2/road_observations/supervisor/cartable/verify/";
var items_api = "/v2/items";
var provinces_api = "/webapi/getuser/province-perm";
var edarat_api = "/public/contents/edarate_shahri_by_province/";
var permission_api = "/webapi/user/get-permission";
const MAP_ENDPOINT = "https://rmsmap.rmto.ir";
var excel_api = "/v2/road_observations/supervisor/cartable/report";
var markers = [];
var markersLayer;
var mapZoom = getWidth() < 508 ? 5 : 6;
var filterDatepicker = {};
var PERMISSIONS = [];
// end variables part
// resize func
function getWidth() {
return Math.max(
document.body.scrollWidth,
document.documentElement.scrollWidth,
document.body.offsetWidth,
document.documentElement.offsetWidth,
document.documentElement.clientWidth
);
}
// end resize func
// map
// icon
var mapIcon = L.icon({
iconUrl: '/dist/images/dashboard/pinmarker_dashboard.png',
iconSize: [32, 32],
});
var activeMapIcon = L.icon({
iconUrl: '/dist/images/dashboard/pinmarker_dashboard_active.png',
iconSize: [32, 32],
});
// icon
var bounds = [
[42.9130026312, 75.6166317076],
[20.5782370061, 30.5092252948],
];
var map = L.map("map", {
maxBounds: bounds,
minZoom: mapZoom,
zoomControl: false,
attributionControl: false
}).setView([35.5468992, 51.7300532], mapZoom);
L.tileLayer(MAP_ENDPOINT + "/141map/{z}/{x}/{y}.png", {
attributionControl: false,
}).addTo(map);
// end map
(() => {
//get permission
showLoaderScreen()
$.ajax({
url: permission_api,
type: "GET",
cache: false,
async: false,
contentType: false,
processData: false,
success: function (result) {
PERMISSIONS = result.data;
},
error: function () {
Swal.fire({
icon: "error",
title: "خطا",
text: "مشکل در دریافت سطح دسترسی",
confirmButtonText: "بروزرسانی صفحه",
showLoaderOnConfirm: true,
preConfirm: () => {
location.reload(true);
},
});
},
});
//end get permission
})()
$(document).bind("click", function (e) {
const clicked = $(e.target);
if (clicked.parents(".toolbox").length != 0) return false;
if (clicked.parents(".datepicker-grid-view").length != 0) return false;
if (clicked.parents(".datepicker-navigator").length != 0) return false;
if (clicked.parents(".datepicker-container").length != 0) return false;
if (clicked.parents(".select2-selection__choice").length != 0) return false;
if (
clicked.closest(".filtering-btn").length == 0 &&
clicked.closest("#filter_box").length == 0 &&
$("filter_box").css("display") != "none"
) {
$("#filter_box").css("display", "none");
}
});
const FilterBoxInit = () => {
const top = $('.dt-button')[0].offsetHeight + 5
return `
`
}
const fillFilterBox = () => {
//fill provinces
$.ajax({
url: `${provinces_api}${$.inArray("show-road-item-supervise-cartable", PERMISSIONS) != -1 ? "?type=all" : ""}`,
type: "get",
headers: {
"X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr("content"),
},
cache: false,
contentType: false,
processData: false,
beforeSend: function () {
$('.fill-provinces').empty()
$('.fill-provinces').append(`
`)
},
success: function (result) {
$('.fill-provinces').empty()
$('.fill-provinces').append(`
`)
result.data.map(item => {
$('.fill-provinces').append(`
`)
})
},
error: function (request) {
},
complete: function () {
}
});
//fill datepicker
filterDatepicker.from = $(
"#filter_from_activity_date_time"
).persianDatepicker({
format: "YYYY/MM/DD",
autoClose: true,
initialValue: false,
onSelect: function (unix) {
filterDatepicker.from.touched = true;
if (
filterDatepicker.from.getState().selected.unixDate >=
filterDatepicker.to.getState().selected.unixDate
) {
filterDatepicker.to.setDate(
filterDatepicker.from.getState().selected.unixDate
);
}
if (
filterDatepicker.to &&
filterDatepicker.to.options &&
filterDatepicker.to.options.minDate != unix
) {
let cachedValue =
filterDatepicker.to.getState().selected.unixDate;
filterDatepicker.to.options = { minDate: unix };
if (filterDatepicker.from.touched) {
filterDatepicker.to.setDate(cachedValue);
}
}
},
});
filterDatepicker.to = $(
"#filter_to_activity_date_time"
).persianDatepicker({
format: "YYYY/MM/DD",
autoClose: true,
initialValue: false,
onSelect: function (unix) {
filterDatepicker.to.touched = true;
},
});
$(document).on('input', '#filter_from_activity_date_time', function (e) {
if (e.target.value == '') {
filterDatepicker.from.setDate(moment().valueOf())
filterDatepicker.to.setDate(moment().valueOf())
$("#filter_to_activity_date_time").val('')
$("#filter_from_activity_date_time").val('')
}
})
$(document).on('input', '#filter_to_activity_date_time', function (e) {
if (e.target.value == '') {
filterDatepicker.from.setDate(moment().valueOf())
filterDatepicker.to.setDate(moment().valueOf())
$("#filter_from_activity_date_time").val('')
$("#filter_to_activity_date_time").val('')
}
})
//fill status
$('.fill-status').empty()
$('.fill-status').append(`
`)
}
const filterBox = (show) => {
$('#filter_box').css('display', show ? 'flex' : 'none')
}
$(function () {
// supervisor cartable table
showLoaderScreen();
supervisorCartable = $("#supervisor_cartable").DataTable({
serverSide: true,
dom: "<<'d-flex justify-content-between align-items-center'lB>p>",
pagingType: "simple_numbers",
scrollX: true,
filter: true,
language: {
sEmptyTable: "هیچ دادهای در جدول وجود ندارد",
sInfo: "نمایش _START_ تا _END_ از _TOTAL_ ردیف",
sInfoEmpty: "نمایش 0 تا 0 از 0 ردیف",
sInfoFiltered: "(فیلتر شده از _MAX_ ردیف)",
sInfoPostFix: "",
sInfoThousands: ",",
sLengthMenu: "نمایش _MENU_ ردیف",
sLoadingRecords: "در حال بارگزاری...",
sProcessing: "در حال پردازش...",
sSearch: "جستجو: ",
sZeroRecords: "رکوردی با این مشخصات پیدا نشد",
oPaginate: {
sFirst: "برگهی نخست",
sLast: "برگهی آخر",
sNext: "بعدی",
sPrevious: "قبلی",
},
oAria: {
sSortAscending: ": فعال سازی نمایش به صورت صعودی",
sSortDescending: ": فعال سازی نمایش به صورت نزولی",
},
},
order: [
[10, "asc"],
[0, "desc"]
],
processing: true,
select: true,
ajax: {
url: supervisorCartable_url,
type: "GET",
beforeSend: function () {
showLoaderScreen();
if (markers.length != 0) {
map.removeLayer(markersLayer);
markers = [];
markersLayer.clearLayers();
}
$("#supervisor_cartable").find("tbody tr").removeClass("activate-row");
},
dataSrc: function (json) {
let data = json.data;
hideLoaderScreen();
if (data.length == 0) {
return data
}
const latlonArr = []
for (let i = 0; i < data.length; i++) {
let marker = new L.Marker([data[i].lat, data[i].lng], { icon: mapIcon, id: data[i].AutoID }).on('click', function (e) {
const id = e.target.options.id
supervisorCartable.rows().eq(0).map(index => {
if (supervisorCartable.row(index).data().AutoID == id) {
const node = supervisorCartable.row(index).node()
$("html, body").animate({
scrollTop: $(node).offset().top,
},
100
);
$("#supervisor_cartable").find("tbody tr").removeClass("activate-row");
$(node).addClass("activate-row");
setTimeout(() => {
markersLayer.eachLayer(layer => {
if (layer.options.id == id) {
layer.setIcon(activeMapIcon)
layer.setZIndexOffset(100)
return
}
layer.setZIndexOffset(0)
layer.setIcon(mapIcon)
})
map.flyTo([supervisorCartable.row(index).data().lat, supervisorCartable.row(index).data().lng], 16, { duration: .5 });
}, 500)
}
})
})
markers.push(marker);
latlonArr.push([data[i].lat, data[i].lng])
}
markersLayer = new L.LayerGroup(markers);
map.addLayer(markersLayer);
$("html, body").animate({
scrollTop: $('#map').offset().top - 50,
},
100
);
setTimeout(() => {
map.flyToBounds(latlonArr, { padding: [60, 60], duration: .5 })
}, 250);
hideLoaderScreen();
return json.data;
},
error: function (request) {
ajax_error(request.responseJSON, request.status);
hideLoaderScreen();
},
},
columns: [
// 1
{
className: "text-center align-middle",
data: null,
name: {
name: 'road_observeds.id',
type: 'text'
},
render: function (data, type, row) {
return `${data.status == 0 ? '' : ''}${data.road_observeds_id}
`
},
searchable: true,
orderable: true,
},
// 2
{
className: "text-center align-middle",
data: "fk_RegisteredEventMessage",
name: {
name: 'fk_RegisteredEventMessage',
type: 'text'
},
searchable: true,
orderable: true,
},
// 3
{
className: "text-center align-middle",
data: "province_fa",
name: {
name: 'road_observeds.province_id',
type: 'select'
},
searchable: true,
orderable: true,
},
// 5
{
className: "text-center align-middle",
data: "edarate_shahri_name_fa",
name: {
name: 'edarate_shahri.name_fa',
type: 'text'
},
searchable: true,
orderable: true,
},
// 6
{
className: "text-center align-middle",
data: "Title",
name: {
name: 'Title',
type: 'text'
},
searchable: true,
orderable: true,
},
// 7
{
className: "text-center align-middle",
data: "FeatureTypeTitle",
name: {
name: 'FeatureTypeTitle',
type: 'text'
},
searchable: true,
orderable: true,
},
// 8
{
className: "text-center align-middle",
data: null,
name: {
name: 'option',
type: 'option'
},
render: function (data, type, row) {
if (data.Description == null) {
return `اطلاعاتی موجود نیست!!!`
} else {
return ``
}
},
searchable: false,
orderable: false,
},
// 9
{
className: "text-center align-middle",
data: "MobileForSendEventSms",
name: {
name: 'MobileForSendEventSms',
type: 'text'
},
searchable: true,
orderable: true,
},
// 10
{
className: "text-center text-nowrap align-middle",
data: null,
name: {
name: 'rms_last_activity',
type: 'between'
},
render: function (data, type, row) {
if (data.rms_last_activity_fa == null) return '-'
return data.rms_last_activity_fa
},
searchable: true,
orderable: true,
},
// 11
{
className: "text-center align-middle",
data: null,
name: {
name: 'option',
type: 'option'
},
render: function (data, type, row) {
if (data.image_after || data.image_before)
return ``
return '-'
},
searchable: true,
orderable: false,
},
// 12
{
className: "text-center align-middle",
data: "status_fa",
name: {
name: 'status',
type: 'select'
},
searchable: true,
orderable: true,
},
// 13
{
className: "text-center align-middle",
data: null,
name: {
name: 'rms_description',
type: 'text'
},
render: function (data, type, row) {
if (data.rms_description == null) {
return `اطلاعاتی موجود نیست!!!`
} else {
return ``
}
},
searchable: true,
orderable: false,
},
// 14
{
className: "text-center align-middle",
data: null,
name: {
name: 'supervisor_description',
type: 'text'
},
render: function (data, type, row) {
if (data.supervisor_description == null) {
return `اطلاعاتی موجود نیست!!!`
} else {
return ``
}
},
searchable: true,
orderable: false,
},
// 15
{
className: "text-center sorting align-middle",
data: null,
name: {
name: 'option',
type: 'option'
},
render: function (data, type, row) {
if (data.status == 0) {
return ``;
} else if (data.status == 1 || data.status == 2) {
return `${moment(data.supervising_time).format("HH:mm:ss | jYYYY/jMM/jDD")}
`;
}
},
searchable: false,
orderable: false,
},
],
buttons: [
{
text: 'فیلتر پیشرفته',
className: 'filtering-btn',
action: function (e, dt, node, config) {
filterBox(true)
}
},
{
text: 'گزارش اکسل',
className: 'table-btns',
action: function (e, dt, node, config) {
let queryParems = [];
const id = $("#filter_id").val();
const province = $("#filter_province").val();
const status = $("#filter_status").val();
let activityDate = {}
if ($("#filter_from_activity_date_time").val() != "" && $("#filter_to_activity_date_time").val() != "") {
activityDate.from = moment(
filterDatepicker.from.getState().selected.year +
"/" +
filterDatepicker.from.getState().selected.month +
"/" +
filterDatepicker.from.getState().selected.date,
"jYYYY/jM/jD"
).format("YYYY-MM-DD");
activityDate.to = moment(
filterDatepicker.to.getState().selected.year +
"/" +
filterDatepicker.to.getState().selected.month +
"/" +
filterDatepicker.to.getState().selected.date,
"jYYYY/jM/jD"
).format("YYYY-MM-DD");
queryParems.push(`fromDate=${activityDate.from}`);
queryParems.push(`toDate=${activityDate.to}`);
}
if (id != '') queryParems.push(`id=${id}`);
if (province != '-1') queryParems.push(`province_id=${province}`);
if (status != '-1') queryParems.push(`status=${status}`);
const url = `${excel_api}${queryParems.length != 0 ? `?${queryParems.join("&")}` : ""}`;
window.open(url);
}
}
],
initComplete: function () {
$(".dt-buttons").append(FilterBoxInit)
fillFilterBox()
},
});
// end supervisor cartable table
});
// end on load
$("#supervisor_cartable").on("click", "tbody tr", function (e) {
e.preventDefault()
let tr = $(this).closest("tr");
let row = supervisorCartable.row(tr);
let data = row.data();
dataOnMap(data);
$("#supervisor_cartable").find("tbody tr").removeClass("activate-row");
$(this).addClass("activate-row");
});
// show active data on map
function dataOnMap(data) {
$("html, body").animate({
scrollTop: $("#map").offset().top - 50,
},
100
);
setTimeout(() => {
markersLayer.eachLayer(layer => {
if (layer.options.id == data.AutoID) {
layer.setIcon(activeMapIcon)
layer.setZIndexOffset(100)
return
}
layer.setZIndexOffset(0)
layer.setIcon(mapIcon)
})
map.flyTo([data.lat, data.lng], 16, { duration: .5 });
}, 500)
}
// end show active data on map
// filtering
$(document).on('click', '#btn_filter', function () {
filterBox(false)
let _table = supervisorCartable
const id = $("#filter_id").val();
const province = $("#filter_province").val();
const status = $("#filter_status").val();
let activityDate = {}
if (
$("#filter_from_activity_date_time").val() != "" &&
$("#filter_to_activity_date_time").val() != ""
) {
activityDate.from = moment(
filterDatepicker.from.getState().selected.year +
"/" +
filterDatepicker.from.getState().selected.month +
"/" +
filterDatepicker.from.getState().selected.date,
"jYYYY/jM/jD"
).format("YYYY-MM-DD");
activityDate.to = moment(
filterDatepicker.to.getState().selected.year +
"/" +
filterDatepicker.to.getState().selected.month +
"/" +
filterDatepicker.to.getState().selected.date,
"jYYYY/jM/jD"
).format("YYYY-MM-DD");
}
if (id != '') {
_table = _table.column(0).search(id);
} else {
_table = _table.column(0).search('');
}
if (province != '-1') {
_table = _table.column(2).search(province);
} else {
_table = _table.column(2).search('');
}
if (status != '-1') {
_table = _table.column(10).search(status);
} else {
_table = _table.column(10).search('');
}
if (Object.keys(activityDate).length !== 0) {
_table = _table.column(8).search(`${activityDate.from}&${activityDate.to}`);
} else {
_table = _table.column(8).search('');
}
_table.draw();
})
// end filtering
// confirmation action
$("#supervisor_cartable").on("click", ".confirm", function (e) {
e.stopPropagation()
const modal = $("#verifyDescription_modal");
let tr = $(this).closest("tr");
let row = supervisorCartable.row(tr);
let data = row.data();
modal.find(".clean-textarea").val("");
modal.find("#description").removeClass("invalid").removeClass("valid").removeClass('value-important');
modal.find("#description").data("id", data.road_observeds_id);
modal.find("#description").data("acceptDecline", 1);
modal.modal("show");
$("#verify").removeClass("d-none");
$("#supervisor_cartable").find("tbody tr").removeClass("activate-row");
$(tr).addClass("activate-row");
});
// end confirmation action
// show supervisor description
$("#supervisor_cartable").on("click", ".show-supervisor-description-btn", function (e) {
e.stopPropagation()
const modal = $("#verifyDescription_modal");
let tr = $(this).closest("tr");
let row = supervisorCartable.row(tr);
let data = row.data();
modal.find(".clean-textarea").val("");
modal.find(".value-important").removeClass("invalid").removeClass("valid");
$("#verify").addClass("d-none");
modal.find("#description").val(data.supervisor_description);
modal.modal("show");
$("#supervisor_cartable").find("tbody tr").removeClass("activate-row");
$(tr).addClass("activate-row");
});
// end show supervisor description
// show rms description
$("#supervisor_cartable").on("click", ".show-rms-description-btn", function (e) {
e.stopPropagation()
const modal = $("#rmsDescription_modal");
let tr = $(this).closest("tr");
let row = supervisorCartable.row(tr);
let data = row.data();
modal.find(".clean-textarea").val("");
modal.find(".value-important").removeClass("invalid").removeClass("valid");
$("#verify").addClass("d-none");
modal.find("#rms_description").val(data.rms_description);
modal.modal("show");
$("#supervisor_cartable").find("tbody tr").removeClass("activate-row");
$(tr).addClass("activate-row");
});
// end show rms description
// show description
$("#supervisor_cartable").on("click", ".show-description-btn", function (e) {
e.stopPropagation()
const modal = $("#description_modal");
let tr = $(this).closest("tr");
let row = supervisorCartable.row(tr);
let data = row.data();
modal.find(".clean-textarea").val("");
modal.find(".value-important").removeClass("invalid").removeClass("valid");
$("#verify").addClass("d-none");
modal.find("#description").val(data.Description);
modal.modal("show");
$("#supervisor_cartable").find("tbody tr").removeClass("activate-row");
$(tr).addClass("activate-row");
});
// end show description
// disapproval action
$("#supervisor_cartable").on("click", ".disapproval", function (e) {
e.stopPropagation()
const modal = $("#verifyDescription_modal");
let tr = $(this).closest("tr");
let row = supervisorCartable.row(tr);
let data = row.data();
modal.find(".clean-textarea").val("");
modal.find("#description").removeClass("invalid").removeClass("valid").addClass('value-important');
modal.find("#description").data("id", data.road_observeds_id);
modal.find("#description").data("acceptDecline", 2);
modal.modal("show");
$("#verify").removeClass("d-none");
$("#supervisor_cartable").find("tbody tr").removeClass("activate-row");
$(tr).addClass("activate-row");
});
// end disapproval action
// accept/decline
$(document).on("click", "#verify", function (e) {
e.preventDefault()
const modal = $(this).parents(".modal");
const verify = modal.find("#description").data("acceptDecline");
const desc = modal.find("#description").val();
const dataId = modal.find("#description").data("id");
modal.find("textarea.value-important").each(function () {
$(this).val() == "" ? $(this).removeClass("valid").addClass("invalid") : $(this).removeClass("invalid").addClass("valid");
});
if (modal.find(".invalid").length != 0) { return } else {
Swal.fire({
icon: "warning",
title: `${verify == 1 ? "آیا از تایید فعالیت مربوطه اطمینان دارید؟" : "آیا از عدم تایید فعالیت مربوطه اطمینان دارید؟"}`,
showCancelButton: true,
confirmButtonColor: "#2d7c23",
cancelButtonColor: "#971b1b",
confirmButtonText: "بله اطمینان دارم",
cancelButtonText: "خیر!",
showLoaderOnConfirm: true,
preConfirm: () => {
modal.modal("hide");
verifyFunc(verify, dataId, desc);
},
});
}
});
// end accept/decline
// verify
function verifyFunc(verify, dataId, desc) {
let formData = new FormData();
formData.append("verify", verify);
formData.append("description", desc);
$.ajax({
url: verify_api + dataId,
type: "POST",
headers: {
"X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr("content"),
},
data: formData,
cache: false,
contentType: false,
processData: false,
success: function (result) {
hideLoaderScreen();
supervisorCartable.ajax.reload(null, false);
},
error: function (request) {
hideLoaderScreen();
ajax_error(request.responseJSON, request.status);
},
complete: function () {
getSideBarActivity();
}
});
}
// end verify
// show images
$("#supervisor_cartable").on("click", ".show-images-btn", function (e) {
e.stopPropagation()
const modal = $("#show_images_modal");
let tr = $(this).closest("tr");
let row = supervisorCartable.row(tr);
let data = row.data();
modal.find('#image_before a').attr('href', '')
modal.find('#image_before img').attr('src', '')
if (data.image_before) {
modal.find('#image_before a').attr('href', data.image_before)
modal.find('#image_before img').attr('src', data.image_before)
}
modal.find('#image_after a').attr('href', '')
modal.find('#image_after img').attr('src', '')
if (data.image_after) {
modal.find('#image_after a').attr('href', data.image_after)
modal.find('#image_after img').attr('src', data.image_after)
}
modal.modal("show");
$("#supervisor_cartable").find("tbody tr").removeClass("activate-row");
$(tr).addClass("activate-row");
});
// end show images