const MAP_ENDPOINT = "https://rmsmap.rmto.ir/141map/{z}/{x}/{y}.png";
var GRAB_ALL_DATA_API = "https://rms.rmto.ir/reports_summary";
const get_rahdari_projects_by_id = "https://rms.rmto.ir/rahdari_projects/project/";
let TAB_ID = 1
let isAnimating = false
var delayed;
let markers = []
var markersLayer = null
let projectsMap;
const bounds = [
[42.9130026312, 75.6166317076],
[20.5782370061, 35.5092252948],
];
const showbounds = [32.4279, 53.688];
const mapZoom = getWidth() < 508 ? 4 : 5;
let contract_subitem_projects;
let user_activity;
let gasht_rozane;
let top_provinces_according_to_number_of_complaints_handled;
let road_item;
let number_of_complaints_per_type;
let mehvar_statistics;
let safety_and_privacy;
function createColors(count) {
var point = 200 / (count - 1);
var step = 0;
var colors = [];
for (let i = 0; i < count; i++) {
var hsv = {
h: Math.floor(step),
s: 80,
v: 70,
};
colors[i] = Color(hsv).toCSS();
step += point;
}
return colors;
}
function makeIcon(iconSize, layer) {
return L.divIcon({
className: "custom-div-icon",
html: "",
iconSize: [0, 0],
});
}
var greenIcon = L.divIcon({
className: "custom-div-icon",
html: "",
iconSize: [16, 16],
});
var redIcon = L.divIcon({
className: "custom-div-icon",
html: "",
iconSize: [16, 16],
});
var orangeIcon = L.divIcon({
className: "custom-div-icon",
html: "",
iconSize: [16, 16],
});
var fakeIcon = L.divIcon({
className: "custom-div-icon",
html: "",
iconSize: [6, 6],
});
var brownIcon = L.divIcon({
className: "custom-div-icon",
html: "",
iconSize: [16, 16],
});
var yellowIcon = L.divIcon({
className: "custom-div-icon",
html: "",
iconSize: [16, 16],
});
var blueIcon = L.divIcon({
className: "custom-div-icon",
html: "",
iconSize: [16, 16],
});
var stepOneIcon = L.divIcon({
className: "custom-div-icon",
html: "",
iconSize: [16, 16],
});
var stepTwoIcon = L.divIcon({
className: "custom-div-icon",
html: "",
iconSize: [16, 16],
});
var stepThreeIcon = L.divIcon({
className: "custom-div-icon",
html: "",
iconSize: [16, 16],
});
function getWidth() {
return Math.max(
document.body.scrollWidth,
document.documentElement.scrollWidth,
document.body.offsetWidth,
document.documentElement.offsetWidth,
document.documentElement.clientWidth
);
};
const animateTabs = (old_tab, tab_id) => {
isAnimating = true
$(`.tab-box[data-tab-id='${old_tab}']`).fadeOut(100, () => {
$(`.tab-box[data-tab-id='${tab_id}']`).fadeIn(300, () => {
document.querySelector(`.tab-btn[data-tab-id='${tab_id}']`).scrollIntoView({
behavior: 'smooth'
});
isAnimating = false
})
})
}
const gashtRozaneComponent = (data) =>
`
${data.province_fa}
${parseInt(data.distance).toLocaleString()}
`;
(() => {
$('[data-toggle="popover"]').popover({
trigger: 'focus'
})
Chart.defaults.font.family = "IRANSansFaNum";
projectsMap = L.map("projects_map", {
maxBounds: bounds,
minZoom: 5,
maxZoom: 16,
attributionControl: false
}).setView(showbounds, 5);
L.tileLayer(MAP_ENDPOINT, {}).addTo(projectsMap);
$("#data_now").text(moment().locale('fa').format('dddd DD MMMM YYYY'))
$('.tab-btn').removeClass('active')
$(`.tab-btn[data-tab-id='${TAB_ID}']`).addClass('active')
$(`.tab-box[data-tab-id='${TAB_ID}']`).show()
$.ajax({
url: GRAB_ALL_DATA_API,
type: "GET",
cache: false,
async: false,
contentType: false,
processData: false,
success: function (result) {
data = result.data;
contract_subitem_projects = data.find(({ report_name }) => report_name === 'contract_subitem_projects');
user_activity = data.find(({ report_name }) => report_name === 'user_activity');
road_item = data.find(({ report_name }) => report_name === 'road_item');
mehvar_statistics = data.find(({ report_name }) => report_name === 'mehvar_statistics');
safety_and_privacy = data.find(({ report_name }) => report_name === 'safety_and_privacy');
number_of_complaints_per_type = data.find(({ report_name }) => report_name === 'number_of_complaints_per_type');
gasht_rozane = data.find(({ report_name }) => report_name === 'gasht_rozane');
top_provinces_according_to_number_of_complaints_handled = data.find(({ report_name }) => report_name === 'top_provinces_according_to_number_of_complaints_handled');
receipt = data.find(({ report_name }) => report_name === 'receipt');
},
error: function () {
Swal.fire({
icon: "error",
title: "خطا",
text: "مشکل در دریافت اطلاعات",
confirmButtonText: "بروزرسانی صفحه",
showLoaderOnConfirm: true,
preConfirm: () => {
location.reload(true);
},
});
},
});
// end grab data
for (const point of contract_subitem_projects.data.points) {
let icon;
switch (point.project_type_id) {
case 1:
icon = blueIcon;
break;
case 2:
icon = yellowIcon;
break;
case 3:
icon = greenIcon;
break;
case 4:
icon = redIcon;
break;
case 5:
icon = brownIcon;
break;
case 6:
icon = orangeIcon;
break;
}
let marker = new L.Marker([point.start_lat, point.start_lng], {
id: point,
icon: icon
}).on('click', () => {
window.open(get_rahdari_projects_by_id + point.id)
})
markers.push(marker);
}
markersLayer = new L.LayerGroup(markers);
projectsMap.addLayer(markersLayer);
projectsMap.on('zoomend', function () {
if (markersLayer === null) {
return 0;
}
let iconSize;
switch (projectsMap.getZoom()) {
case 5:
case 6:
case 7:
iconSize = 3;
break;
case 8:
iconSize = 4;
break;
case 9:
iconSize = 5;
break;
case 10:
iconSize = 6;
break;
case 11:
iconSize = 7;
break;
case 12:
iconSize = 7;
break;
case 13:
iconSize = 9;
break;
case 14:
case 15:
case 16:
case 17:
case 18:
iconSize = 10;
break;
}
markersLayer.eachLayer(function (layer) {
return layer.setIcon(makeIcon(iconSize, layer));
});
});
$(document).find('#user_activity_avarage').text(parseInt(user_activity.data[0].user_activity_avarage))
$(document).find('#user_count').text(parseInt(user_activity.data[0].user_count))
// gasht rozane
$(document).find('#gasht_rozane_box').empty()
gasht_rozane.data.map(item => {
const content = gashtRozaneComponent(item)
$(document).find('#gasht_rozane_box').append(content)
})
// end gasht rozane
// top_provinces_according_to_number_of_complaints_handled
const top_provinces_according_to_number_of_complaints_handled_Label = [];
const top_provinces_according_to_number_of_complaints_handled_Count = [];
for (let i = 0; i < top_provinces_according_to_number_of_complaints_handled.data.length; i++) {
top_provinces_according_to_number_of_complaints_handled_Count.push(top_provinces_according_to_number_of_complaints_handled.data[i].count_number);
top_provinces_according_to_number_of_complaints_handled_Label.push(top_provinces_according_to_number_of_complaints_handled.data[i].ProvinceName);
}
const top_provinces_according_to_number_of_complaints_handled_ChartData = {
labels: top_provinces_according_to_number_of_complaints_handled_Label,
datasets: [{
data: top_provinces_according_to_number_of_complaints_handled_Count,
backgroundColor: [
'#f3722c'
],
borderColor: '#f3722c',
borderWidth: 3,
}]
};
const top_provinces_according_to_number_of_complaints_handled_option = {
responsive: true,
maintainAspectRatio: false,
layout: {
padding: 15
},
plugins: {
title: {
display: false,
},
legend: {
display: false
}
},
}
const top_provinces_according_to_number_of_complaints_handled_chart = new Chart(
document.getElementById("top_provinces_according_to_number_of_complaints_handled").getContext("2d"),
{
type: 'line',
data: top_provinces_according_to_number_of_complaints_handled_ChartData,
options: top_provinces_according_to_number_of_complaints_handled_option,
}
);
// end top_provinces_according_to_number_of_complaints_handled
// status_sperate
const status_sperate_Label = [];
const status_sperate_Count = [];
for (let i = 0; i < contract_subitem_projects.data.status_sperate.data.length; i++) {
status_sperate_Count.push(contract_subitem_projects.data.status_sperate.data[i]);
status_sperate_Label.push(contract_subitem_projects.data.status_sperate.label[i]);
}
const status_sperate_ChartData = {
labels: status_sperate_Label,
datasets: [{
data: status_sperate_Count,
backgroundColor: [
'#f3722c',
'#f8961e',
'#577590',
'#43aa8b'
],
}]
};
const status_sperate_option = {
responsive: true,
maintainAspectRatio: false,
layout: {
padding: 15
},
animation: {
onComplete: () => {
delayed = true;
},
delay: (context) => {
let delay = 0;
if (context.type === 'data' && context.mode === 'default' && !delayed) {
delay = context.dataIndex * 300 + context.datasetIndex * 100;
}
return delay;
},
},
plugins: {
title: {
display: true,
position: 'top',
text: "پروژه ها به تفکیک وضعیت",
font: {
family: "IRANSansFaNum",
size: 14,
weight: 'bold'
}
},
legend: {
display: true,
position: "left",
rtl: true,
labels: {
boxWidth: 13,
fontSize: 16,
fontStyle: "bold",
fontColor: "#000",
},
},
},
}
const status_sperate_chart = new Chart(
document.getElementById("project_status_sperate").getContext("2d"),
{
type: 'doughnut',
data: status_sperate_ChartData,
options: status_sperate_option,
}
);
// end status_sperate
// type_sperate
const type_sperate_Label = [];
const type_sperate_Count = [];
for (let i = 0; i < contract_subitem_projects.data.type_sperate.data.length; i++) {
type_sperate_Count.push(contract_subitem_projects.data.type_sperate.data[i]);
type_sperate_Label.push(contract_subitem_projects.data.type_sperate.label[i]);
}
const type_sperate_ChartData = {
labels: type_sperate_Label,
datasets: [{
data: type_sperate_Count,
backgroundColor: [
'#277da1',
'#43aa8b',
'#577590',
'#f8961e',
'#f3722c',
"#dd2c2c"
],
}]
};
const type_sperate_option = {
responsive: true,
maintainAspectRatio: false,
layout: {
padding: 15
},
animation: {
onComplete: () => {
delayed = true;
},
delay: (context) => {
let delay = 0;
if (context.type === 'data' && context.mode === 'default' && !delayed) {
delay = context.dataIndex * 300 + context.datasetIndex * 100;
}
return delay;
},
},
plugins: {
title: {
display: true,
position: 'top',
text: "پروژه ها به تفکیک ماهیت",
font: {
family: "IRANSansFaNum",
size: 14,
weight: 'bold'
}
},
legend: {
display: true,
position: "left",
rtl: true,
labels: {
boxWidth: 13,
fontSize: 16,
fontStyle: "bold",
fontColor: "#000",
},
},
},
}
const type_sperate_chart = new Chart(
document.getElementById("project_type_sperate").getContext("2d"),
{
type: 'pie',
data: type_sperate_ChartData,
options: type_sperate_option,
}
);
// end type_sperate
// road_item
const road_item_ChartData = {
labels: road_item.data.labels,
datasets: [{
data: road_item.data.datasets[0].data,
backgroundColor: createColors(road_item.data.datasets[0].data.length).reverse(),
borderRadius: 4
}]
};
const road_item_option = {
responsive: true,
maintainAspectRatio: false,
layout: {
padding: 15
},
plugins: {
title: {
display: false,
},
legend: {
display: false
}
},
}
const road_item_chart = new Chart(
document.getElementById("road_item").getContext("2d"),
{
type: 'bar',
data: road_item_ChartData,
options: road_item_option,
}
);
// end road_item
// number_of_complaints_per_type
const number_of_complaints_per_type_Label = [];
const number_of_complaints_per_type_Count_processed = [];
const number_of_complaints_per_type_Count_reached = [];
for (let i = 0; i < number_of_complaints_per_type.data.labels.length; i++) {
number_of_complaints_per_type_Count_processed.push(number_of_complaints_per_type.data.datasets[0].data[i]);
number_of_complaints_per_type_Count_reached.push(number_of_complaints_per_type.data.datasets[1].data[i]);
if (screen.width < 1000 && screen.width >= 490) {
number_of_complaints_per_type_Label.push(number_of_complaints_per_type.data.labels[i].substring(0, 14) + "...");
} else if (screen.width < 490) {
number_of_complaints_per_type_Label.push("");
}
else {
number_of_complaints_per_type_Label.push(number_of_complaints_per_type.data.labels[i]);
}
}
const number_of_complaints_per_type_ChartData = {
labels: number_of_complaints_per_type_Label,
datasets: [
{
label: number_of_complaints_per_type.data.datasets[0].label,
backgroundColor: "#277da1",
data: number_of_complaints_per_type_Count_processed
},
{
label: number_of_complaints_per_type.data.datasets[1].label,
backgroundColor: "#f3722c",
data: number_of_complaints_per_type_Count_reached
}
]
};
const number_of_complaints_per_type_option = {
responsive: true,
maintainAspectRatio: true,
layout: {
padding: 15
},
animation: {
onComplete: () => {
delayed = true;
},
delay: (context) => {
let delay = 0;
if (context.type === 'data' && context.mode === 'default' && !delayed) {
delay = context.dataIndex * 300 + context.datasetIndex * 100;
}
return delay;
},
},
plugins: {
title: {
display: false,
},
legend: {
display: false
}
},
}
const number_of_complaints_per_type_chart = new Chart(
document.getElementById("number_of_complaints_per_type").getContext("2d"),
{
type: 'bar',
data: number_of_complaints_per_type_ChartData,
options: number_of_complaints_per_type_option,
}
);
// end number_of_complaints_per_type
// mehvar_statistics_pie length & cnt
const mehvar_statistics_pie_Label_length = [];
const mehvar_statistics_pie_Count_length = [];
const mehvar_statistics_pie_Count_cnt = [];
for (let i = 0; i < mehvar_statistics.data.charts.pies.length; i++) {
mehvar_statistics_pie_Count_length.push(mehvar_statistics.data.charts.pies[i].lenght);
mehvar_statistics_pie_Count_cnt.push(mehvar_statistics.data.charts.pies[i].cnt);
mehvar_statistics_pie_Label_length.push(mehvar_statistics.data.charts.pies[i].blockage_cause_fa);
}
const mehvar_statistics_pie_ChartData_length = {
labels: mehvar_statistics_pie_Label_length,
datasets: [{
data: mehvar_statistics_pie_Count_length,
backgroundColor: [
'#277da1',
'#43aa8b',
'#577590',
'#f8961e',
'#f3722c'
],
}]
};
const mehvar_statistics_pie_ChartData_cnt = {
labels: mehvar_statistics_pie_Label_length,
datasets: [{
data: mehvar_statistics_pie_Count_cnt,
backgroundColor: [
'#277da1',
'#43aa8b',
'#577590',
'#f8961e',
'#f3722c'
],
}]
};
const mehvar_statistics_pie_option_length = {
responsive: true,
maintainAspectRatio: false,
layout: {
padding: 15
},
animation: {
onComplete: () => {
delayed = true;
},
delay: (context) => {
let delay = 0;
if (context.type === 'data' && context.mode === 'default' && !delayed) {
delay = context.dataIndex * 300 + context.datasetIndex * 100;
}
return delay;
},
},
plugins: {
title: {
display: true,
position: 'top',
text: "طول محور های آسیب دیده",
font: {
family: "IRANSansFaNum",
size: 14,
weight: 'bold'
}
},
legend: {
display: true,
position: "left",
rtl: true,
labels: {
boxWidth: 13,
fontSize: 16,
fontStyle: "bold",
fontColor: "#000",
},
},
},
}
const mehvar_statistics_pie_option_cnt = {
responsive: true,
maintainAspectRatio: false,
layout: {
padding: 15
},
animation: {
onComplete: () => {
delayed = true;
},
delay: (context) => {
let delay = 0;
if (context.type === 'data' && context.mode === 'default' && !delayed) {
delay = context.dataIndex * 300 + context.datasetIndex * 100;
}
return delay;
},
},
plugins: {
title: {
display: true,
position: 'top',
text: "تعداد محور های آسیب دیده",
font: {
family: "IRANSansFaNum",
size: 14,
weight: 'bold'
}
},
legend: {
display: true,
position: "left",
rtl: true,
labels: {
boxWidth: 13,
fontSize: 16,
fontStyle: "bold",
fontColor: "#000",
},
},
},
}
const mehvar_statistics_pie_chart_length = new Chart(
document.getElementById("mehvar_statistics_pie_length").getContext("2d"),
{
type: 'doughnut',
data: mehvar_statistics_pie_ChartData_length,
options: mehvar_statistics_pie_option_length,
}
);
const mehvar_statistics_pie_chart_cnt = new Chart(
document.getElementById("mehvar_statistics_pie_cnt").getContext("2d"),
{
type: 'pie',
data: mehvar_statistics_pie_ChartData_cnt,
options: mehvar_statistics_pie_option_cnt,
}
);
// end mehvar_statistics_pie length & cnt
// road geometry acc contribution
const mehvar_statistics_stack_data = mehvar_statistics.data.charts.stack;
const mylabels = []
const mydatasets = []
const colors = [
'#277da1',
'#43aa8b',
'#577590',
'#f8961e',
'#f3722c'
]
let cntarr = {}
let lengtharr = {}
for (const [index, mevar_stack] of mehvar_statistics_stack_data.entries()) {
for (const item of mevar_stack.data) {
if (cntarr[item.blockage_cause_fa] == undefined) cntarr[item.blockage_cause_fa] = []
cntarr[item.blockage_cause_fa][index] = item.cnt
if (lengtharr[item.blockage_cause_fa] == undefined) lengtharr[item.blockage_cause_fa] = []
lengtharr[item.blockage_cause_fa][index] = item.length
}
mylabels.push(mevar_stack.axis_type_fa)
}
let indexColor = 0
for (const [key, item] of Object.entries(cntarr)) {
mydatasets.push(
{
label: key,
data: item,
stack: 0,
backgroundColor: colors[indexColor]
}
)
indexColor++
}
indexColor = 0
for (const [key, item] of Object.entries(lengtharr)) {
mydatasets.push(
{
label: key,
data: item,
stack: 1,
backgroundColor: colors[indexColor]
}
)
indexColor++
}
const mehvar_statistics_stack_ChartData = {
labels: mylabels,
datasets: mydatasets,
};
const mehvar_statistics_stack_option = {
responsive: true,
maintainAspectRatio: true,
layout: {
padding: 15
},
animation: {
onComplete: () => {
delayed = true;
},
delay: (context) => {
let delay = 0;
if (context.type === 'data' && context.mode === 'default' && !delayed) {
delay = context.dataIndex * 300 + context.datasetIndex * 100;
}
return delay;
},
},
plugins: {
title: {
display: true,
position: 'top',
text: "اطلاعات محور های آسیب دیده (طول/تعداد)",
font: {
family: "IRANSansFaNum",
size: 14,
weight: 'bold'
}
},
legend: {
display: false
}
},
scales: {
x: {
stacked: true,
},
y: {
stacked: true
}
},
}
const mehvar_statistics_stack_Chart = new Chart(
document.getElementById("mehvar_statistics_stack").getContext("2d"),
{
type: 'bar',
data: mehvar_statistics_stack_ChartData,
options: mehvar_statistics_stack_option,
}
);
// end road geometry acc contribution
// safety and privacy
const safety_and_privacy_ChartData = {
labels: safety_and_privacy.data.label,
datasets: [
{
label: 'شناسایی',
data: safety_and_privacy.data.data[0],
backgroundColor: '#277da1',
borderRadius: 8
},
{
label: 'اقدام',
data: safety_and_privacy.data.data[1],
backgroundColor: '#43aa8b',
borderRadius: 8
},
{
label: 'برخورد',
data: safety_and_privacy.data.data[2],
backgroundColor: '#f8961e',
borderRadius: 8
},
],
};
const safety_and_privacy_option = {
indexAxis: 'y',
responsive: true,
maintainAspectRatio: true,
layout: {
padding: 15
},
plugins: {
title: {
display: true,
position: 'top',
text: "تعداد اقدامات",
font: {
family: "IRANSansFaNum",
size: 14,
weight: 'bold'
}
},
legend: {
legend: {
display: true,
position: "top",
rtl: true,
labels: {
boxWidth: 13,
fontSize: 16,
fontStyle: "bold",
fontColor: "#000",
},
},
}
},
scales: {
x: {
stacked: true,
},
y: {
stacked: true
}
},
}
const safety_and_privacy_Chart = new Chart(
document.getElementById("safety_and_privacy").getContext("2d"),
{
type: 'bar',
data: safety_and_privacy_ChartData,
options: safety_and_privacy_option,
}
);
// end safety and privacy
// receipt
const receipt_Label = [];
const receipt_Count = [];
for (let i = 0; i < receipt.data.chart.length; i++) {
receipt_Count.push(receipt.data.chart[i].sum);
receipt_Label.push(receipt.data.chart[i].province_fa);
}
const receipt_ChartData = {
labels: receipt_Label,
datasets: [{
data: receipt_Count,
backgroundColor: createColors(receipt_Count.length).reverse(),
borderRadius: 4
}]
};
const receipt_option = {
responsive: true,
maintainAspectRatio: false,
layout: {
padding: 15
},
plugins: {
title: {
display: false,
},
legend: {
display: false
}
},
}
const receipt_chart = new Chart(
document.getElementById("receipt").getContext("2d"),
{
type: 'bar',
data: receipt_ChartData,
options: receipt_option,
}
);
$(document).find('#total_damage').text(parseFloat(receipt.data.sum.sum).toLocaleString("en") + ' ریال')
// document.getElementById("total_damage").getContext()
// end receipt
})()
$(document).on('click', '.tab-btn', function () {
if (isAnimating) return
const old_tab = TAB_ID
TAB_ID = $(this).data('tabId')
if (old_tab == TAB_ID) return
$('.tab-btn').removeClass('active')
$(`.tab-btn[data-tab-id='${TAB_ID}']`).addClass('active')
animateTabs(old_tab, TAB_ID)
})