//default variables DEFAULT_ACTION_ID = 1; DEFALUT_YEAR = moment().format('jYYYY'); DEFAULT_TIMER = 300; DEFAULT_URL = "/"; DEFAULT_API = "api/bi/"; DEFAULT_WEB = "bi/"; MAP_ENDPOINT = "https://rmsmap.rmto.ir"; MAP_MIN_ZOOM = 5; MAP_MAX_ZOOM = 10; RAHDARI_PROJECTS_ID = 1; RAHDARI_CURRENT_ACTIVITYS_ID = 2; RAHDARI_MISSIONS_ID = 3; HANDLED_COMPLAINTS_ID = 4; DANGER_POINTS_ID = 5; ACCIDENT_POINTS_ID = 6; DAMAGE_AXES_ID = 7; //charts variables var StatusChart = null; var StatusChartPrint = null; var charts = { action1Chart1: null, action1Chart2: null, action1Chart3: null, action1Chart4: null, action2Chart1: null, action2Chart2: null, action4Chart1: null, action4Chart2: null, action5Chart1: null, action5Chart2: null, action7Chart1: null, action7Chart2: null, action1Chart1Print: null, action1Chart2Print: null, action1Chart3Print: null, action1Chart4Print: null, action2Chart1Print: null, action2Chart2Print: null, action4Chart1Print: null, action4Chart2Print: null, action5Chart1Print: null, action5Chart2Print: null, action7Chart1Print: null, action7Chart2Print: null, }; //current variables var currentActionId; var currentRoadInfrastructureDetails; var currentTimer; var currentDate = {}; //current filter variables var currentFilterProvince; var currentFilterCity; var currentFilterYear; var currentFilterMonth; var currentFilterFromDate; var currentFilterToDate; var currentFilterQuery; var currentFilterRahdariActivity; var currentFilterRoadInfrastructure; //variables var timer; var dateFrom; var dateTo; var provinces; var cities; var loadChart = []; var loadProgressBar = []; var disabledButtonMap = {}; var MapBi; var bounds = [ [42.9130026312, 75.6166317076], [20.5782370061, 30.5092252948], ]; var showbounds = [32.4279, 53.688]; var pahneArray = []; var iranGeoJSON = JSON.parse(PROVICES_GEOJSON); var iranMapGeo; var iranArrayCount = 0; var iranCityCount = 0; var keepMapFeatureColor = null; var fullCityGeoJSONTemp = new Object(); var fullCityGeoJSON = JSON.parse(CITIES_GEOJSON); var iranCityMapGeo; var iranAllCityMapGeo; var flagProvince = 0; var eachfeature = []; var diagramData = []; var choosenProvince; var cityArray = []; var currentChoosenCity = -1; var currentTarget = new Object(); var currentCityDiagram = new Object(); var curentCityArray = []; var curentValueCity = []; var AllCityDiagram = new Object(); var AllcityArray = []; var AllValueCity = []; var curentValueAllCity = []; var allCityGeoTemp = new Object(); var allCityCount = 0; var allCityFlag = 0; var CityArraySelected = []; var AllCityArrayPopUp = []; let popup = L.popup(); $(document).ready(function () { timer = setInterval(function () {}, currentTimer * 1000); initPage(); }); async function initPage() { await showLoader(false); $("#filter-year").append(``); for (let index = +DEFALUT_YEAR ; index >= 1393; index--) { $("#filter-year").append(``); } //init filter provinces let isSuccessProvinceAjax = false; $.ajax({ url: DEFAULT_URL + "public/contents/provinces", method: "GET", async: false, success: function ({ data }) { provinces = data; data.map((element) => { $('select[name="filter-province"]').append( `` ); }); isSuccessProvinceAjax = true; }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات استان", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); if (!isSuccessProvinceAjax) return false; //init filter rahradi activity items isSuccessRahdariActivityAjax = false; $.ajax({ url: DEFAULT_URL + DEFAULT_API + "rahdari-activity", method: "GET", async: false, success: function ({ data }) { data.map((element) => { $('select[name="rahradi-activity-items"]').append( `` ); }); currentFilterRahdariActivity = $( 'select[name="rahradi-activity-items"]' ).val(); isSuccessRahdariActivityAjax = true; }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات ریزآیتم های فعالیت جاری", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); if (!isSuccessRahdariActivityAjax) return false; //init filter year $('select[name="filter-year"]').val(DEFALUT_YEAR); // init datapickers dateFrom = $("input[name=filter-date-from]").persianDatepicker({ format: "YYYY/MM/DD", initialValue: false, autoClose: true, initialValueType: "persian", toolbox: { calendarSwitch: { enabled: false, }, }, onSelect: function (unix) { dateFrom.touched = true; if ( dateFrom.getState().selected.unixDate >= dateTo.getState().selected.unixDate ) { dateTo.setDate(dateFrom.getState().selected.unixDate); } if (dateTo && dateTo.options && dateTo.options.minDate != unix) { let cachedValue = dateTo.getState().selected.unixDate; dateTo.options = { minDate: unix, }; if (dateTo.touched) { dateTo.setDate(cachedValue); } } hasChangeFilter(); }, }); dateTo = $("input[name=filter-date-to]").persianDatepicker({ format: "YYYY/MM/DD", initialValue: false, autoClose: true, initialValueType: "persian", toolbox: { calendarSwitch: { enabled: false, }, }, onSelect: function (unix) { hasChangeFilter(); }, }); Chart.defaults.font.family = "IRANSansFaNum"; Chart.register(ChartDataLabels); MapBi = L.map("map", { maxBounds: bounds, minZoom: MAP_MIN_ZOOM, zoomControl: false, }).setView(showbounds, 5); L.tileLayer(MAP_ENDPOINT + "/141map/{z}/{x}/{y}.png", {}).addTo(MapBi); // custom zoom bar control that includes a Zoom Home function L.Control.mapButtons = L.Control.extend({ options: { position: "topright", zoomInText: "+", zoomInTitle: "بزرگنمایی", zoomOutText: "-", zoomOutTitle: "کوچکنمایی", homeText: '', homeTitle: "پیشفرض", backText: '', backTitle: "بازگشت", cityText: '', cityTitle: "شهرستان ها", }, onAdd: function (map) { var controlName = "gin-control-zoom", container = L.DomUtil.create("div", controlName + " leaflet-bar"), options = this.options; this._zoomInButton = this._createButton( options.zoomInText, options.zoomInTitle, controlName + "-in", container, this._zoomIn ); this._zoomOutButton = this._createButton( options.zoomOutText, options.zoomOutTitle, controlName + "-out", container, this._zoomOut ); this._homeButton = this._createButton( options.homeText, options.homeTitle, controlName + "-home", container, this._home ); this._backButton = this._createButton( options.backText, options.backTitle, controlName + "-back", container, this._back ); this._cityButton = this._createButton( options.cityText, options.cityTitle, controlName + "-city", container, this._city ); this._updateDisabled(); map.on("zoomend zoomlevelschange", this._updateDisabled, this); return container; }, onRemove: function (map) { map.off("zoomend zoomlevelschange", this._updateDisabled, this); }, _zoomIn: function (e) { this._map.zoomIn(e.shiftKey ? 3 : 1); }, _zoomOut: function (e) { this._map.zoomOut(e.shiftKey ? 3 : 1); }, _home: function (e) { returnToHomeOnMap(); }, _back: function (e) { returnToProvinceOnMap(); }, _city: function (e) { if (disabledButtonMap.city) return false; allCityFlag = 1; currentFilterProvince = 0; lifeCycle({ sync: false, }); }, _createButton: function (html, title, className, container, fn) { var link = L.DomUtil.create("a", className, container); link.innerHTML = html; link.href = "#"; link.title = title; L.DomEvent.on(link, "mousedown dblclick", L.DomEvent.stopPropagation) .on(link, "click", L.DomEvent.stop) .on(link, "click", fn, this) .on(link, "click", this._refocusOnMap, this); return link; }, _updateDisabled: function () { var map = this._map, className = "leaflet-disabled"; L.DomUtil.removeClass(this._zoomInButton, className); L.DomUtil.removeClass(this._zoomOutButton, className); if (map._zoom === map.getMinZoom()) { L.DomUtil.addClass(this._zoomOutButton, className); } if (map._zoom === map.getMaxZoom()) { L.DomUtil.addClass(this._zoomInButton, className); } }, }); // add the new control to the map var mapButtons = new L.Control.mapButtons(); mapButtons.addTo(MapBi); defaultPage(); } function defaultPage() { //update current variables currentActionId = DEFAULT_ACTION_ID; currentRoadInfrastructureDetails = $( 'select[name="road-infrastructure-details"]' ).val(); //clear buttonActions $(".btn-action-box").removeClass("active"); //update this button $('.btn-action-box[data-action-id="' + currentActionId + '"]').addClass( "active" ); //check disabled filter if ( $.inArray( currentActionId, $('select[name="filter-province"]').data("disable") ) != -1 ) $('select[name="filter-province"]').val(0).attr("disabled", "disabled"); else $('select[name="filter-province"]').removeAttr("disabled"); if ( $.inArray( currentActionId, $('select[name="filter-city"]').data("disable") ) != -1 ) $('select[name="filter-city"]').val(0).attr("disabled", "disabled"); else $('select[name="filter-city"]').removeAttr("disabled"); if ( $.inArray( currentActionId, $('select[name="filter-year"]').data("disable") ) != -1 ) { $('select[name="filter-year"]').attr("disabled", "disabled"); $('.btn-action-box[data-reset-year="true"]').data( "defaultYear", DEFALUT_YEAR ); } else $('select[name="filter-year"]').removeAttr("disabled"); if ( $.inArray( currentActionId, $('select[name="filter-month"]').data("disable") ) != -1 ) $('select[name="filter-month"]').val(0).attr("disabled", "disabled"); else $('select[name="filter-month"]').removeAttr("disabled"); if ( $.inArray( currentActionId, $('input[name="filter-date-from"]').data("disable") ) != -1 ) $('input[name="filter-date-from"]').val("").attr("disabled", "disabled"); else $('input[name="filter-date-from"]').removeAttr("disabled"); if ( $.inArray( currentActionId, $('input[name="filter-date-to"]').data("disable") ) != -1 ) $('input[name="filter-date-to"]').val("").attr("disabled", "disabled"); else $('input[name="filter-date-to"]').removeAttr("disabled"); //update current filter variables currentFilterProvince = $('select[name="filter-province"]').val(); currentFilterCity = $('select[name="filter-city"]').val(); currentFilterYear = $('select[name="filter-year"]').val(); currentFilterMonth = $('select[name="filter-month"]').val(); currentFilterFromDate = $('input[name="filter-date-from"]').val(); currentFilterToDate = $('input[name="filter-date-to"]').val(); currentFilterRoadInfrastructure = $( 'select[name="road-infrastructure-details"]' ).val(); //create map //create chart daily status $("#StatusChart").attr( "width", $("#StatusChart").closest(".canvas-box").width() ); $("#StatusChart").attr("height", 1200); var StatusContent = document.getElementById("StatusChart").getContext("2d"); StatusChart = new Chart(StatusContent, { type: "bar", data: { labels: [], datasets: [ { data: [], backgroundColor: [], label: "", datalabels: { anchor: "end", align: "end", }, }, ], }, options: { indexAxis: "y", plugins: { legend: { display: false, }, datalabels: { anchor: "start", align: function (context) { if (context.dataset.data[context.dataIndex] == 0) { return "center"; } return "end"; }, color: function (context) { if (context.dataset.data[context.dataIndex] == 0) { return "#000"; } return "#fff"; }, backgroundColor: function (context) { if (context.dataset.data[context.dataIndex] == 0) { return null; } return context.dataset.backgroundColor[context.dataIndex]; }, textAlign: "center", }, }, scales: { y: { ticks: { font: { size: 11, }, }, }, }, }, }); $("#StatusChartPrint").attr("width", 1000); $("#StatusChartPrint").attr("height", 700); var StatusPrintContent = document .getElementById("StatusChartPrint") .getContext("2d"); StatusChartPrint = new Chart(StatusPrintContent, { type: "bar", data: { labels: [], datasets: [ { data: [], backgroundColor: [], label: "", datalabels: { anchor: "end", align: "end", }, }, ], }, options: { layout: { padding: { left: 10, right: 10, top: 5, bottom: 10, }, }, indexAxis: "x", plugins: { title: { display: true, padding: 15, position: "top", align: "center", font: { size: 20, weight: "bold", }, }, subtitle: { display: true, padding: 15, position: "top", align: "center", font: { size: 24, weight: "bold", }, }, legend: { display: false, }, datalabels: { rotation: -90, font: { size: 18, }, anchor: "start", align: function (context) { if (context.dataset.data[context.dataIndex] == 0) { return "center"; } return "end"; }, color: function (context) { if (context.dataset.data[context.dataIndex] == 0) { return "#000"; } return "#fff"; }, backgroundColor: function (context) { if (context.dataset.data[context.dataIndex] == 0) { return null; } return context.dataset.backgroundColor[context.dataIndex]; }, textAlign: "center", }, }, scales: { x: { ticks: { font: { size: 20, }, }, }, }, }, }); //clear charts box $(".charts-box").attr("aria-display", "hide"); //show current charts box $('.charts-box[data-action-id="' + currentActionId + '"]').attr( "aria-display", "show" ); $('.charts-box[data-action-id="' + currentActionId + '"] .chart-box').each( function () { var chartType = $(this).find(".canvas-container").data("chartType"); var actionId = $(this).find(".canvas-container").attr("id"); var datasetCount = $(this) .find(".canvas-container") .data("chartDatasetCount"); var chartLegend = $(this).find(".canvas-container").data("chartLegend"); // create charts if (charts[String(actionId)] == null && chartType == "bar") { $("#" + actionId).attr( "width", $("#" + actionId) .closest(".canvas-box") .width() ); $("#" + actionId).attr( "height", $("#" + actionId) .closest(".canvas-box") .height() ); var datasets = []; for (let i = 0; i < datasetCount; i++) { datasets[i] = { data: [], backgroundColor: [], label: "", }; } var defaultData = { labels: [], datasets: datasets, }; //for print var contentPrint = document .getElementById(actionId + "Print") .getContext("2d"); charts[String(actionId) + "Print"] = new Chart(contentPrint, { type: chartType, data: defaultData, options: { layout: { padding: { left: 10, right: 10, top: 5, bottom: 10, }, }, scales: { x: { ticks: { font: { size: 20, }, }, }, }, plugins: { title: { display: true, padding: 15, position: "top", align: "center", font: { size: 20, weight: "bold", }, }, subtitle: { display: true, padding: 15, position: "top", align: "center", font: { size: 24, weight: "bold", }, }, legend: { display: chartLegend, labels: { font: { size: 16, }, }, }, datalabels: { font: { size: 18, }, anchor: "start", align: function (context) { if (context.dataset.data[context.dataIndex] == 0) { return "center"; } return "end"; }, color: function (context) { if (context.dataset.data[context.dataIndex] == 0) { return "#000"; } return "#fff"; }, backgroundColor: function (context) { if (context.dataset.data[context.dataIndex] == 0) { return null; } if (typeof context.dataset.backgroundColor == "string") { return context.dataset.backgroundColor; } return context.dataset.backgroundColor[context.dataIndex]; }, textAlign: "center", }, }, }, }); var content = document.getElementById(actionId).getContext("2d"); charts[String(actionId)] = new Chart(content, { type: chartType, data: defaultData, options: { layout: { padding: { left: 10, right: 10, top: 5, bottom: 10, }, }, scales: { x: { ticks: { font: { size: 11, }, }, }, }, plugins: { legend: { display: chartLegend, }, datalabels: { anchor: "start", align: function (context) { if (context.dataset.data[context.dataIndex] == 0) { return "center"; } return "end"; }, color: function (context) { if (context.dataset.data[context.dataIndex] == 0) { return "#000"; } return "#fff"; }, backgroundColor: function (context) { if (context.dataset.data[context.dataIndex] == 0) { return null; } if (typeof context.dataset.backgroundColor == "string") { return context.dataset.backgroundColor; } return context.dataset.backgroundColor[context.dataIndex]; }, textAlign: "center", }, }, }, }); } else if (charts[String(actionId)] == null && chartType == "doughnut") { var ratio = +$("#" + actionId) .closest(".canvas-box") .width() / $("#" + actionId) .closest(".canvas-box") .height(); var content = document.getElementById(actionId).getContext("2d"); charts[String(actionId)] = new Chart(content, { type: chartType, data: {}, options: { aspectRatio: ratio, layout: { padding: { left: 10, right: 10, top: 10, bottom: 10, }, }, plugins: { legend: { display: true, position: "left", labels: { font: { size: 11, }, }, }, datalabels: { color: "#fff", textAlign: "center", }, }, }, }); //for print var ratio = +$("#" + actionId + "Print") .closest(".canvas-box") .width() / $("#" + actionId + "Print") .closest(".canvas-box") .height(); var contentPrint = document .getElementById(actionId + "Print") .getContext("2d"); charts[String(actionId) + "Print"] = new Chart(contentPrint, { type: chartType, data: {}, options: { aspectRatio: ratio, layout: { padding: { left: 10, right: 10, top: 5, bottom: 10, }, }, plugins: { title: { display: true, padding: 15, position: "top", align: "center", font: { size: 20, weight: "bold", }, }, subtitle: { display: true, padding: 15, position: "top", align: "center", font: { size: 24, weight: "bold", }, }, legend: { display: true, position: "bottom", labels: { padding: 15, font: { size: 16, }, }, }, datalabels: { font: { size: 18, }, color: "#fff", textAlign: "center", }, }, }, }); } else if ( charts[String(actionId)] == null && chartType == "progressBar" ) { $("#" + actionId).css( "width", $("#" + actionId) .closest(".canvas-box") .width() + "px" ); $("#" + actionId).css( "height", $("#" + actionId) .closest(".canvas-box") .height() + "px" ); var content = document.getElementById(actionId); charts[String(actionId)] = new ProgressBar.SemiCircle(content, { color: "#343a40", strokeWidth: 12, trailWidth: 12, svgStyle: { display: "block", width: $("#" + actionId) .closest(".canvas-box") .width() + "px", height: $("#" + actionId) .closest(".canvas-box") .height() + "px", }, text: { value: "", }, from: { color: "#ED1C24", }, to: { color: "#39B54A", }, step: function (state, circle, attachment) { circle.path.setAttribute("stroke", state.color); }, }); charts[String(actionId)].text.style.fontFamily = "IRANSansFaNum"; charts[String(actionId)].text.style.fontSize = "30px"; } } ); //call lifeCycle lifeCycle({ sync: false, }); } $(document).on("click", ".btn-action-box", function () { //clear buttonActions $(".btn-action-box").removeClass("active"); //update this button $(this).addClass("active"); //update previous variables var previousActionId = currentActionId; //update current variables currentActionId = $(this).data("actionId"); //check disabled map button if (currentActionId == DANGER_POINTS_ID) { $(".gin-control-zoom-city").addClass("leaflet-disabled"); disabledButtonMap.city = true; allCityFlag = 0; } else { $(".gin-control-zoom-city").removeClass("leaflet-disabled"); disabledButtonMap.city = false; } //check disabled filter if ( $.inArray( currentActionId, $('select[name="filter-province"]').data("disable") ) != -1 ) { $('select[name="filter-province"]').val(0).attr("disabled", "disabled"); currentFilterProvince = $('select[name="filter-province"]').val(); } else $('select[name="filter-province"]').removeAttr("disabled"); if ( $.inArray( currentActionId, $('select[name="filter-city"]').data("disable") ) != -1 ) { $('select[name="filter-city"]').val(0).attr("disabled", "disabled"); currentFilterCity = $('select[name="filter-city"]').val(); } else $('select[name="filter-city"]').removeAttr("disabled"); if ( $.inArray( currentActionId, $('select[name="filter-year"]').data("disable") ) != -1 ) { $('select[name="filter-year"]').attr("disabled", "disabled"); $('.btn-action-box[data-reset-year="true"]').data( "defaultYear", DEFALUT_YEAR ); } else $('select[name="filter-year"]').removeAttr("disabled"); if ( $.inArray( currentActionId, $('select[name="filter-month"]').data("disable") ) != -1 ) { $('select[name="filter-month"]').val(0).attr("disabled", "disabled"); currentFilterMonth = $('select[name="filter-month"]').val(); } else $('select[name="filter-month"]').removeAttr("disabled"); if ( $.inArray( currentActionId, $('input[name="filter-date-from"]').data("disable") ) != -1 ) { $('input[name="filter-date-from"]').val("").attr("disabled", "disabled"); currentFilterFromDate = $('input[name="filter-date-from"]').val(); } else $('input[name="filter-date-from"]').removeAttr("disabled"); if ( $.inArray( currentActionId, $('input[name="filter-date-to"]').data("disable") ) != -1 ) { $('input[name="filter-date-to"]').val("").attr("disabled", "disabled"); currentFilterToDate = $('input[name="filter-date-to"]').val(); } else $('input[name="filter-date-to"]').removeAttr("disabled"); if ( $('.btn-action-box[data-action-id="' + previousActionId + '"]').data( "resetYear" ) == false || $('.btn-action-box[data-action-id="' + currentActionId + '"]').data( "resetYear" ) == false ) { $('select[name="filter-year"]').val( $('.btn-action-box[data-action-id="' + currentActionId + '"]').data( "defaultYear" ) ); currentFilterYear = $('select[name="filter-year"]').val(); } //clear charts box $(".charts-box").attr("aria-display", "hide"); //show current charts box $('.charts-box[data-action-id="' + currentActionId + '"]').attr( "aria-display", "show" ); // create charts $('.charts-box[data-action-id="' + currentActionId + '"] .chart-box').each( function () { var chartType = $(this).find(".canvas-container").data("chartType"); var actionId = $(this).find(".canvas-container").attr("id"); var datasetCount = $(this) .find(".canvas-container") .data("chartDatasetCount"); var chartLegend = $(this).find(".canvas-container").data("chartLegend"); // create charts if (charts[String(actionId)] == null && chartType == "bar") { $("#" + actionId).attr( "width", $("#" + actionId) .closest(".canvas-box") .width() ); $("#" + actionId).attr( "height", $("#" + actionId) .closest(".canvas-box") .height() ); var datasets = []; for (let i = 0; i < datasetCount; i++) { datasets[i] = { data: [], backgroundColor: [], label: "", }; } var defaultData = { labels: [], datasets: datasets, }; //for print var contentPrint = document .getElementById(actionId + "Print") .getContext("2d"); charts[String(actionId) + "Print"] = new Chart(contentPrint, { type: chartType, data: defaultData, options: { layout: { padding: { left: 10, right: 10, top: 5, bottom: 10, }, }, scales: { x: { ticks: { font: { size: 20, }, }, }, }, plugins: { title: { display: true, padding: 15, position: "top", align: "center", font: { size: 20, weight: "bold", }, }, subtitle: { display: true, padding: 15, position: "top", align: "center", font: { size: 24, weight: "bold", }, }, legend: { display: chartLegend, labels: { font: { size: 16, }, }, }, datalabels: { font: { size: 18, }, anchor: "start", align: function (context) { if (context.dataset.data[context.dataIndex] == 0) { return "center"; } return "end"; }, color: function (context) { if (context.dataset.data[context.dataIndex] == 0) { return "#000"; } return "#fff"; }, backgroundColor: function (context) { if (context.dataset.data[context.dataIndex] == 0) { return null; } if (typeof context.dataset.backgroundColor == "string") { return context.dataset.backgroundColor; } return context.dataset.backgroundColor[context.dataIndex]; }, textAlign: "center", }, }, }, }); var content = document.getElementById(actionId).getContext("2d"); charts[String(actionId)] = new Chart(content, { type: chartType, data: defaultData, options: { layout: { padding: { left: 10, right: 10, top: 5, bottom: 10, }, }, scales: { x: { ticks: { font: { size: 11, }, }, }, }, plugins: { legend: { display: chartLegend, }, datalabels: { anchor: "start", align: function (context) { if (context.dataset.data[context.dataIndex] == 0) { return "center"; } return "end"; }, color: function (context) { if (context.dataset.data[context.dataIndex] == 0) { return "#000"; } return "#fff"; }, backgroundColor: function (context) { if (context.dataset.data[context.dataIndex] == 0) { return null; } if (typeof context.dataset.backgroundColor == "string") { return context.dataset.backgroundColor; } return context.dataset.backgroundColor[context.dataIndex]; }, textAlign: "center", }, }, }, }); } else if (charts[String(actionId)] == null && chartType == "doughnut") { var ratio = +$("#" + actionId) .closest(".canvas-box") .width() / $("#" + actionId) .closest(".canvas-box") .height(); var content = document.getElementById(actionId).getContext("2d"); charts[String(actionId)] = new Chart(content, { type: chartType, data: {}, options: { aspectRatio: ratio, layout: { padding: { left: 10, right: 10, top: 10, bottom: 10, }, }, plugins: { legend: { display: true, position: "left", labels: { font: { size: 11, }, }, }, datalabels: { color: "#fff", textAlign: "center", }, }, }, }); //for print var ratio = +$("#" + actionId + "Print") .closest(".canvas-box") .width() / $("#" + actionId + "Print") .closest(".canvas-box") .height(); var contentPrint = document .getElementById(actionId + "Print") .getContext("2d"); charts[String(actionId) + "Print"] = new Chart(contentPrint, { type: chartType, data: {}, options: { aspectRatio: ratio, layout: { padding: { left: 10, right: 10, top: 5, bottom: 10, }, }, plugins: { title: { display: true, padding: 15, position: "top", align: "center", font: { size: 20, weight: "bold", }, }, subtitle: { display: true, padding: 15, position: "top", align: "center", font: { size: 24, weight: "bold", }, }, legend: { display: true, position: "bottom", labels: { padding: 15, font: { size: 16, }, }, }, datalabels: { font: { size: 18, }, color: "#fff", textAlign: "center", }, }, }, }); } else if ( charts[String(actionId)] == null && chartType == "progressBar" ) { $("#" + actionId).css( "width", $("#" + actionId) .closest(".canvas-box") .width() + "px" ); $("#" + actionId).css( "height", $("#" + actionId) .closest(".canvas-box") .height() + "px" ); var content = document.getElementById(actionId); charts[String(actionId)] = new ProgressBar.SemiCircle(content, { color: "#343a40", strokeWidth: 12, trailWidth: 12, svgStyle: { display: "block", width: $("#" + actionId) .closest(".canvas-box") .width() + "px", height: $("#" + actionId) .closest(".canvas-box") .height() + "px", }, text: { value: "", }, from: { color: "#ED1C24", }, to: { color: "#39B54A", }, step: function (state, circle, attachment) { circle.path.setAttribute("stroke", state.color); }, }); charts[String(actionId)].text.style.fontFamily = "IRANSansFaNum"; charts[String(actionId)].text.style.fontSize = "30px"; } } ); //call lifeCycle lifeCycle({ sync: false, }); }); $(document).on("click", ".btn-sync-data", function () { //update current filter variables currentFilterProvince = $('select[name="filter-province"]').val(); currentFilterCity = $('select[name="filter-city"]').val(); currentFilterYear = $('select[name="filter-year"]').val(); currentFilterMonth = $('select[name="filter-month"]').val(); currentFilterFromDate = $('input[name="filter-date-from"]').val(); currentFilterToDate = $('input[name="filter-date-to"]').val(); allCityFlag = 0; //call lifeCycle lifeCycle({ sync: false, }); }); $(document).on("click", ".btn-filter-reset", function () { allCityFlag = 0; //clear filters $('select[name="filter-province"]').val(0); $('select[name="filter-city"]').empty(); $('select[name="filter-city"]').append( `` ); $('select[name="filter-city"]').val(0); $('select[name="filter-year"]').val( $('.btn-action-box[data-action-id="' + currentActionId + '"]').data( "resetYear" ) ? DEFALUT_YEAR : $('.btn-action-box[data-action-id="' + currentActionId + '"]').data( "defaultYear" ) ); $('select[name="filter-month"]').val(0); $('input[name="filter-date-from"]').val(""); $('input[name="filter-date-to"]').val(""); //update current filter variables currentFilterProvince = $('select[name="filter-province"]').val(); currentFilterCity = $('select[name="filter-city"]').val(); currentFilterYear = $('select[name="filter-year"]').val(); currentFilterMonth = $('select[name="filter-month"]').val(); currentFilterFromDate = $('input[name="filter-date-from"]').val(); currentFilterToDate = $('input[name="filter-date-to"]').val(); $('.btn-action-box[data-reset-year="true"]').data( "defaultYear", DEFALUT_YEAR ); //call lifeCycle lifeCycle({ sync: false, }); hasChangeFilter(); }); $(document).on("click", ".btn-filter-send", function () { if ( ($('input[name="filter-date-from"]').val() != "") ^ ($('input[name="filter-date-to"]').val() != "") ) { Swal.fire({ icon: "error", title: "خطا", text: "لطفا تاریخ شروع و پایان را وارد کنید", showCancelButton: true, showConfirmButton: false, cancelButtonText: "بستن", }); return false; } //update current filter variables currentFilterProvince = $('select[name="filter-province"]').val(); currentFilterCity = $('select[name="filter-city"]').val(); currentFilterYear = $('select[name="filter-year"]').val(); currentFilterMonth = $('select[name="filter-month"]').val(); currentFilterFromDate = $('input[name="filter-date-from"]').val(); currentFilterToDate = $('input[name="filter-date-to"]').val(); if (currentFilterProvince != 0) { allCityFlag = 0; } //call lifeCycle lifeCycle({ sync: false, }); hasChangeFilter(); }); $(document).on("change", 'select[name="filter-year"]', function () { $('.btn-action-box[data-reset-year="true"]').data( "defaultYear", $(this).val() ); }); $(document).on( "change", 'select[name="rahradi-activity-items"]', async function () { currentFilterRahdariActivity = $(this).val(); await showLoader(false); $.when(roadItemProjectItemSync(false)).then(() => { hideLoader(false); updateChartsData(loadChart); }); } ); $(document).on( "change", 'select[name="road-infrastructure-details"]', async function () { currentFilterRoadInfrastructure = $(this).val(); await showLoader(false); $.when(roadInfrastructureSync(false)).then(() => { hideLoader(false); }); } ); $(document).on("click", ".chart-print", async function () { let chart = null; let chartId = $(this).parents(".chart-box").find("canvas").attr("id"); let title = $(this).parents(".chart-box").find(".title-print").text(); if (chartId == "StatusChart") { chart = StatusChartPrint; } else { chart = charts[String(chartId) + "Print"]; } await updateBeforePrint(chart, title); let link = document.createElement("a"); link.href = chart.toBase64Image(); link.download = title; link.click(); chart.options.animation.duration = 1000; chart.update(); }); $(document).on("change", 'select[name="filter-province"]', function () { getCitiesByProvince($(this).val()); }); $(document).on("change", "select.filter-control", function () { hasChangeFilter(); }); $(document).on("input", "input.filter-control", function () { hasChangeFilter(); }); async function updateBeforePrint(chart, title) { chart.options.plugins.title.text = "گزارش سامانه جامع راهداری ( مورخ : " + moment().format("HH:mm jYYYY/jMM/jDD") + " )"; chart.options.plugins.subtitle.text = title; chart.options.animation.duration = 0; chart.update(); return new Promise((resolve) => setTimeout(resolve, 100)); } function hasChangeFilter() { let hasChange = false; if (currentFilterProvince != $('select[name="filter-province"]').val()) hasChange = true; else if (currentFilterCity != $('select[name="filter-city"]').val()) hasChange = true; else if (currentFilterYear != $('select[name="filter-year"]').val()) hasChange = true; else if (currentFilterMonth != $('select[name="filter-month"]').val()) hasChange = true; else if (currentFilterFromDate != $('input[name="filter-date-from"]').val()) hasChange = true; else if (currentFilterToDate != $('input[name="filter-date-to"]').val()) hasChange = true; if (hasChange) { $(".btn-filter-send").prop("disabled", false); $(".btn-filter-send .btn-filter-send-chenge").attr("aria-display", "show"); $(".btn-filter-send .btn-filter-send-ok").attr("aria-display", "hide"); } else { $(".btn-filter-send").prop("disabled", true); $(".btn-filter-send .btn-filter-send-chenge").attr("aria-display", "hide"); $(".btn-filter-send .btn-filter-send-ok").attr("aria-display", "show"); } } function subHexColor(c1, c2) { var hexStr = (parseInt(c1, 16) - parseInt(c2, 16)).toString(16); while (hexStr.length < 6) { hexStr = "0" + hexStr; } return hexStr; } function getCitiesByProvince(provinceId) { //amir $('select[name="filter-city"]').empty(); $('select[name="filter-city"]').append( `` ); if (provinceId == 0) return false; $.ajax({ url: DEFAULT_URL + "public/contents/provinces/" + provinceId, method: "GET", async: true, beforeSend: function () { $('select[name="filter-city"]').empty(); $('select[name="filter-city"]').append( `` ); }, success: function ({ data }) { $('select[name="filter-city"]').empty(); $('select[name="filter-city"]').append( `` ); cities = data; data.map((element) => { $('select[name="filter-city"]').append( `` ); }); }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات شهرستان", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } function createQuarterColors(data) { var colors = []; if (currentActionId == RAHDARI_PROJECTS_ID) { for (let i = 0; i < data.length; i++) { if (data[i] == 0) colors[i] = "#000"; else { if (data[i] <= 40) colors[i] = "#FF0000"; else if (data[i] < 70) colors[i] = "#FFCC00"; else colors[i] = "#13BB51"; } } } else { var minOfData = Math.min(...data); var maxOfData = Math.max(...data); var quarter = Math.round((maxOfData - minOfData) / 3); for (let i = 0; i < data.length; i++) { if (data[i] == 0) colors[i] = "#000"; else { if (data[i] <= minOfData + quarter) colors[i] = "#FF0000"; else if (data[i] < maxOfData - quarter) colors[i] = "#FFCC00"; else colors[i] = "#13BB51"; } } } return colors; } function createColors(count) { var point = 280 / (count - 1); var step = 0; var colors = []; for (let i = 0; i < count; i++) { var hsv = { h: Math.floor(step), s: 90, v: 71, }; colors[i] = Color(hsv).toCSS(); step += point; } return colors; } function createOneColor(array, colors) { var finalColors = new Array(array.length); for (let i = 0; i < array.length; i++) { finalColors[i] = new Array(array[i].data.length); for (let j = 0; j < array[i].data.length; j++) { finalColors[i][j] = colors[i]; } } return colors; } async function showLoader(sync) { if (sync) $(".sync-text").attr("aria-display", "show"); else $(".bi-loader").attr("aria-display", "show"); return new Promise((resolve) => setTimeout(resolve, 100)); } function hideLoader(sync) { if (sync) $(".sync-text").attr("aria-display", "hide"); else $(".bi-loader").attr("aria-display", "hide"); } function updateSyncDate() { $(".date-chenged").text(moment().format("HH:mm:ss jYYYY/jMM/jDD")); } function updateLabelBoxes() { let staticLabel = []; let statusChart = []; let map = []; let charts = []; const province = $( 'select[name="filter-province"] option[value="' + currentFilterProvince + '"]' ).text(); const city = $( 'select[name="filter-city"] option[value="' + currentFilterCity + '"]' ).text(); statusChart.push( $('.btn-action-box[data-action-id="' + currentActionId + '"]').attr( "aria-label-status-chart" ) ); statusChart.push(province); map.push( $('.btn-action-box[data-action-id="' + currentActionId + '"]').attr( "aria-label-map" ) ); map.push(province); map.push(currentFilterCity != 0 ? ` - ${city}` : ""); charts.push(province); charts.push(currentFilterCity != 0 ? ` - ${city}` : ""); staticLabel.push("از"); staticLabel.push(currentDate.from.format("jYYYY/jMM/jDD")); staticLabel.push("تا"); staticLabel.push(currentDate.to.format("jYYYY/jMM/jDD")); $(".status-chart-title").text( `${statusChart.join(" ")} ( ${staticLabel.join(" ")} )` ); $(".map-title").text(`${map.join(" ")} ( ${staticLabel.join(" ")} )`); $(".text-current-chart-filter").text( ` ${charts.join(" ")} ( ${staticLabel.join(" ")} )` ); } function updateChartsData(charts) { for (let i = 0; i < charts.length; i++) { const { chart, labels, datasets, colors } = charts[i]; chart.data.labels = labels; if (datasets.length == 1) { const dataset = { backgroundColor: colors[0], data: datasets[0].data, }; chart.data.datasets[0] = dataset; chart.update(); } else { for (let k = 0; k < datasets.length; k++) { const dataset = { backgroundColor: colors[k], data: datasets[k].data, label: datasets[k].label, }; chart.data.datasets[k] = dataset; chart.update(); } } } loadChart = []; } function updateProgressBarData(progressBars) { for (let i = 0; i < progressBars.length; i++) { const { progressBarId, animate, text } = progressBars[i]; charts[progressBarId].animate(animate); charts[progressBarId].setText(text); } loadProgressBar = []; } async function lifeCycle({ sync, event, target }) { // reset timer clearInterval(timer); timer = setInterval(function () { lifeCycle({ sync: true, }); }, DEFAULT_TIMER * 1000); //create filter query currentFilterQuery = `?subject_id=${currentActionId}`; currentFilterQuery += currentFilterProvince != 0 ? `&province_id=${currentFilterProvince}` : ``; currentFilterQuery += currentFilterCity != 0 ? `&city_id=${currentFilterCity}` : ``; if (currentFilterFromDate != "" && currentFilterToDate != "") { currentDate.from = moment( dateFrom.getState().selected.year + "/" + dateFrom.getState().selected.month + "/" + dateFrom.getState().selected.date, "jYYYY/jM/jD" ); currentFilterQuery += `&from_date=${currentDate.from.format("YYYY-MM-DD")}`; currentDate.to = moment( dateTo.getState().selected.year + "/" + dateTo.getState().selected.month + "/" + dateTo.getState().selected.date, "jYYYY/jM/jD" ); currentFilterQuery += `&to_date=${currentDate.to.format("YYYY-MM-DD")}`; } else { if (currentFilterMonth != 0) { currentDate.from = moment( currentFilterYear + currentFilterMonth, "jYYYYjM" ); currentDate.from.locale("fa"); currentFilterQuery += `&from_date=${currentDate.from .locale("en") .format("YYYY-MM-DD")}`; currentDate.to = moment( currentFilterYear + currentFilterMonth, "jYYYYjM" ); currentDate.to.locale("fa"); currentDate.to.add(1, "month"); currentFilterQuery += `&to_date=${currentDate.to .locale("en") .format("YYYY-MM-DD")}`; } else { if(currentFilterYear != '0'){ currentDate.from = moment(currentFilterYear, "jYYYY"); currentDate.from.locale("fa"); currentFilterQuery += `&from_date=${currentDate.from .locale("en") .format("YYYY-MM-DD")}`; currentDate.to = moment(currentFilterYear, "jYYYY"); currentDate.to.locale("fa"); currentDate.to.add(1, "year"); currentFilterQuery += `&to_date=${currentDate.to .locale("en") .format("YYYY-MM-DD")}`; }else{ console.log(currentFilterYear); currentDate.from = moment('1393', "jYYYY"); currentDate.from.locale("fa"); currentFilterQuery += `&from_date=${currentDate.from .locale("en") .format("YYYY-MM-DD")}`; currentDate.to = moment(DEFALUT_YEAR, "jYYYY"); currentDate.to.locale("fa"); currentDate.to.add(1, "year"); currentFilterQuery += `&to_date=${currentDate.to .locale("en") .format("YYYY-MM-DD")}`; } } } await showLoader(sync); $.when( roadInfrastructureSync(sync), countActionsSync(sync), statusDiagramSync(sync, event), averageProgressRahdariProjectsSync(sync), separationProjectTypeRahdariProjectsSync(sync), separationLastStatusRahdariProjectsSync(sync), separationAxisTypeRahdariProjectsSync(sync), roadItemProjectItemSync(sync), separationActivityTypeRahdariActivitiesSync(sync), percentComplaintsHandledSync(sync), separationComplainTypeRahdariComplainsSync(sync), countAccidentPointsSync(sync), countNumbersAccidentPointsSync(sync), totalLengthDamagedAxesSync(sync), primaryEstimatesDamagesSync(sync), cityArraySync(sync, event), diagramTileMapSync(sync, event), diagramAllCity(sync) ).then(() => { hideLoader(sync); if (!sync) { if (event == "onClickMap") { showCitiesTileOnMap(target); } else { showProvinceTileOnMap(); } updateChartsData(loadChart); updateProgressBarData(loadProgressBar); } updateSyncDate(); updateLabelBoxes(); }); } function countActionsSync(sync) { $.ajax({ url: DEFAULT_URL + DEFAULT_WEB + "subtitleCounts" + currentFilterQuery, method: "GET", async: sync, success: function ({ data }) { data.subjects.map((subject) => { $('.btn-action-box[data-action-id="' + subject.action_id + '"]') .find(".action-counter") .text(subject.count); }); }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات تعدادها", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } function roadInfrastructureSync(sync) { $.ajax({ url: DEFAULT_URL + DEFAULT_API + "road-infrastructure" + currentFilterQuery + "&type=" + currentFilterRoadInfrastructure, method: "GET", async: sync, success: function ({ data }) { $(".road-infrastructure-counter").text(data); }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات مشخصات زیرساختی راه", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } function statusDiagramSync(sync, event) { $.ajax({ url: DEFAULT_URL + DEFAULT_API + "status-diagram" + currentFilterQuery, method: "GET", async: sync, success: function ({ data, geojson }) { if (sync) { updateChartsData([ { chart: StatusChartPrint, labels: data.labels, datasets: data.datasets, colors: [createQuarterColors(data.datasets[0].data)], }, ]); updateChartsData([ { chart: StatusChart, labels: data.labels, datasets: data.datasets, colors: [createQuarterColors(data.datasets[0].data)], }, ]); diagramData = geojson; if (event != "onClickMap") { showProvinceTileOnMap(); } } else { loadChart.push({ chart: StatusChartPrint, labels: data.labels, datasets: data.datasets, colors: [createQuarterColors(data.datasets[0].data)], }); loadChart.push({ chart: StatusChart, labels: data.labels, datasets: data.datasets, colors: [createQuarterColors(data.datasets[0].data)], }); diagramData = geojson; } }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات نمودار وضعیت", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } //RAHDARI PROJECTS CHARTS function averageProgressRahdariProjectsSync(sync) { if (currentActionId == RAHDARI_PROJECTS_ID) { $.ajax({ url: DEFAULT_URL + DEFAULT_API + "average-progress-rahdari-projects" + currentFilterQuery, method: "GET", async: sync, success: function ({ data }) { if (sync) { updateProgressBarData([ { progressBarId: "action1Chart4", animate: data / 100, text: "%" + data, }, ]); } else { loadProgressBar.push({ progressBarId: "action1Chart4", animate: data / 100, text: "%" + data, }); } }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات میانگین پیشرفت پروژه های راهداری", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } } function separationProjectTypeRahdariProjectsSync(sync) { if (currentActionId == RAHDARI_PROJECTS_ID) { $.ajax({ url: DEFAULT_URL + DEFAULT_API + "separation-project-type-rahdari-projects" + currentFilterQuery, method: "GET", async: sync, success: function ({ data }) { if (sync) { updateChartsData([ { chart: charts["action1Chart3Print"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }, ]); updateChartsData([ { chart: charts["action1Chart3"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }, ]); } else { loadChart.push({ chart: charts["action1Chart3Print"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }); loadChart.push({ chart: charts["action1Chart3"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }); } }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات پروژه ها به تفکیک نوع پروژه", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } } function separationLastStatusRahdariProjectsSync(sync) { if (currentActionId == RAHDARI_PROJECTS_ID) { $.ajax({ url: DEFAULT_URL + DEFAULT_API + "separation-last-status-rahdari-projects" + currentFilterQuery, method: "GET", async: sync, success: function ({ data }) { if (sync) { updateChartsData([ { chart: charts["action1Chart2Print"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }, ]); updateChartsData([ { chart: charts["action1Chart2"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }, ]); } else { loadChart.push({ chart: charts["action1Chart2Print"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }); loadChart.push({ chart: charts["action1Chart2"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }); } }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات پروژه ها به تفکیک آخرین وضعیت", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } } function separationAxisTypeRahdariProjectsSync(sync) { if (currentActionId == RAHDARI_PROJECTS_ID) { $.ajax({ url: DEFAULT_URL + DEFAULT_API + "separation-axis-type-rahdari-projects" + currentFilterQuery, method: "GET", async: sync, success: function ({ data }) { if (sync) { updateChartsData([ { chart: charts["action1Chart1Print"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }, ]); updateChartsData([ { chart: charts["action1Chart1"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }, ]); } else { loadChart.push({ chart: charts["action1Chart1Print"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }); loadChart.push({ chart: charts["action1Chart1"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }); } }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات پروژه ها به تفکیک نوع محور", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } } //RAHDARI CURRENT ACTIVITYS CHARTS function roadItemProjectItemSync(sync) { if (currentActionId == RAHDARI_CURRENT_ACTIVITYS_ID) { $.ajax({ url: DEFAULT_URL + DEFAULT_API + "road-item-project-item" + currentFilterQuery + "&item_id=" + currentFilterRahdariActivity, method: "GET", async: sync, success: function ({ data }) { if (sync) { updateChartsData([ { chart: charts["action2Chart2Print"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }, ]); updateChartsData([ { chart: charts["action2Chart2"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }, ]); } else { loadChart.push({ chart: charts["action2Chart2Print"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }); loadChart.push({ chart: charts["action2Chart2"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }); } }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات فعالیت ها به تفکیک ریزآیتم", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } } function separationActivityTypeRahdariActivitiesSync(sync) { if (currentActionId == RAHDARI_CURRENT_ACTIVITYS_ID) { $.ajax({ url: DEFAULT_URL + DEFAULT_API + "separation-activity-type-rahdari-activities" + currentFilterQuery, method: "GET", async: sync, success: function ({ data }) { if (sync) { updateChartsData([ { chart: charts["action2Chart1Print"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }, ]); updateChartsData([ { chart: charts["action2Chart1"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }, ]); } else { loadChart.push({ chart: charts["action2Chart1Print"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }); loadChart.push({ chart: charts["action2Chart1"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }); } }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات فعالیت ها به تفکیک نوع فعالیت", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } } //HANDLED COMPLAINTS CHARTS function percentComplaintsHandledSync(sync) { if (currentActionId == HANDLED_COMPLAINTS_ID) { $.ajax({ url: DEFAULT_URL + DEFAULT_API + "percent-complaints-handled" + currentFilterQuery, method: "GET", async: sync, success: function ({ data }) { if (sync) { updateProgressBarData([ { progressBarId: "action4Chart2", animate: data / 100, text: "%" + data, }, ]); } else { loadProgressBar.push({ progressBarId: "action4Chart2", animate: data / 100, text: "%" + data, }); } }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات شکایات رسیدگی شده", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } } function separationComplainTypeRahdariComplainsSync(sync) { if (currentActionId == HANDLED_COMPLAINTS_ID) { $.ajax({ url: DEFAULT_URL + DEFAULT_API + "separation-complain-type-rahdari-complains" + currentFilterQuery, method: "GET", async: sync, success: function ({ data }) { var colors = ["#39B54A", "#F26522"]; if (sync) { updateChartsData([ { chart: charts["action4Chart1Print"], labels: data.labels, datasets: data.datasets, colors: colors, }, ]); updateChartsData([ { chart: charts["action4Chart1"], labels: data.labels, datasets: data.datasets, colors: colors, }, ]); } else { loadChart.push({ chart: charts["action4Chart1Print"], labels: data.labels, datasets: data.datasets, colors: colors, }); loadChart.push({ chart: charts["action4Chart1"], labels: data.labels, datasets: data.datasets, colors: colors, }); } }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات شکایات به تفکیک نوع شکایات", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } } //DANGER POINTS CHARTS function countAccidentPointsSync(sync) { if (currentActionId == DANGER_POINTS_ID) { $.ajax({ url: DEFAULT_URL + DEFAULT_API + "count-accident-points" + currentFilterQuery, method: "GET", async: sync, success: function ({ data }) { if (sync) { updateProgressBarData([ { progressBarId: "action5Chart2", animate: data / 100, text: "%" + data, }, ]); } else { loadProgressBar.push({ progressBarId: "action5Chart2", animate: data / 100, text: "%" + data, }); } }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات نقاط رفع شده 1395", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } } function countNumbersAccidentPointsSync(sync) { if (currentActionId == DANGER_POINTS_ID) { $.ajax({ url: DEFAULT_URL + DEFAULT_API + "count-numbers-accident-points" + currentFilterQuery, method: "GET", async: sync, success: function ({ data }) { if (sync) { updateChartsData([ { chart: charts["action5Chart1Print"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }, ]); updateChartsData([ { chart: charts["action5Chart1"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }, ]); } else { loadChart.push({ chart: charts["action5Chart1Print"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }); loadChart.push({ chart: charts["action5Chart1"], labels: data.labels, datasets: data.datasets, colors: [createColors(data.datasets[0].data.length)], }); } }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات نقاط به تفکیک هندسی 1395", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } } //DAMAGE AXES CHARS function totalLengthDamagedAxesSync(sync) { if (currentActionId == DAMAGE_AXES_ID) { $.ajax({ url: DEFAULT_URL + DEFAULT_API + "total-length-damaged-axes" + currentFilterQuery, method: "GET", async: sync, success: function ({ data }) { if (sync) { updateProgressBarData([ { progressBarId: "action7Chart2", animate: 1, text: data + " کیلومتر", }, ]); } else { loadProgressBar.push({ progressBarId: "action7Chart2", animate: 1, text: data + " کیلومتر", }); } }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات مجموع طول محور های آسیب دیده", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } } function primaryEstimatesDamagesSync(sync) { if (currentActionId == DAMAGE_AXES_ID) { $.ajax({ url: DEFAULT_URL + DEFAULT_API + "primary-estimates-damages" + currentFilterQuery, method: "GET", async: sync, success: function ({ data }) { if (sync) { updateProgressBarData([ { progressBarId: "action7Chart1", animate: 1, text: data.toLocaleString("en"), }, ]); } else { loadProgressBar.push({ progressBarId: "action7Chart1", animate: 1, text: data.toLocaleString("en"), }); } }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات برآورد اولیه خسارات", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } } //functions for ajax map function cityArraySync(sync, event) { if (event == "onClickMap") { $.ajax({ url: DEFAULT_URL + "public/contents/provinces/" + currentFilterProvince, method: "GET", async: sync, success: function ({ data }) { cityArray = data; }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات شهرستان", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } } function diagramTileMapSync(sync, event) { if (currentFilterProvince != 0) { $.ajax({ url: DEFAULT_URL + "api/bi/status-diagram-tile" + currentFilterQuery, method: "GET", async: sync, success: function ({ data }) { curentCityArray = []; currentCityDiagram = data.data; var this_row = {}; $.each(currentCityDiagram, function (key, value) { if (key != "") { this_row = { namevalue: key, keyvalue: value, }; curentCityArray.push(this_row); } }); curentValueCity = $.map(currentCityDiagram, function (value, index) { if (index != "") { return [value]; } }); }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات شهرستان", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } } // function for show All city tile function diagramAllCity(sync) { if (allCityFlag == 1) { $.ajax({ url: DEFAULT_URL + "api/bi/status-diagram-tile" + currentFilterQuery, method: "GET", async: sync, success: function ({ data }) { AllCityDiagram = data.data; var this_row = {}; AllcityArray.length = 0; $.each(AllCityDiagram, function (key, value) { if (key != "") { this_row = { namevalue: key, keyvalue: value, }; AllcityArray.push(this_row); } }); curentValueAllCity = $.map(AllCityDiagram, function (value, index) { if (index != "") { return [value]; } }); }, error: function () { Swal.fire({ icon: "error", title: "خطا سرور", text: "مشکل در دریافت اطلاعات شهرستان", confirmButtonText: "بارگذاری مجدد", }).then((result) => { if (result.isConfirmed) { location.reload(true); return true; } }); }, }); } } //function for tile map function showProvinceTileOnMap() { if (currentFilterProvince == 0) { MapBi.setView(showbounds, 5); if (allCityFlag == 1) { removeFeaturesFromMap(); showAllCityTileOnMap(); } else { showLegendOnMap(diagramData); keepMapFeatureColor = null; removeFeaturesFromMap(); removeFeaturesCity(); removeFeautureAllCity(); iranArrayCount = 0; iranMapGeo = L.geoJson(iranGeoJSON, { style: initStyleMapFeatures, onEachFeature: onEachFeature, }); iranMapGeo.addTo(MapBi); } } else { removeFeaturesFromMap(); removeFeautureAllCity(); zoomMapToFeature(eachfeature[currentFilterProvince - 1]); } } function initStyleMapFeatures() { let randomchoose = null; randomchoose = getForArrayFeatureColor( fillColorMap(iranArrayCount, diagramData) ); let StyleMap = { fillColor: randomchoose.color, weight: 2, opacity: 1, color: "white", fillOpacity: 0.5, }; if (randomchoose.num != -2) { if (iranArrayCount == 35) { iranArrayCount = 0; } iranArrayCount++; } return StyleMap; } function getForArrayFeatureColor(arrayNum) { if (keepMapFeatureColor) { return { num: -1, color: keepMapFeatureColor, }; } else { var colors = {}; if (currentActionId == RAHDARI_PROJECTS_ID) { if (arrayNum == null) { colors = { num: arrayNum, color: "#B2B1B9", }; } else if (arrayNum <= 40) colors = { num: arrayNum, color: "#FF0000", }; else if (arrayNum < 70) colors = { num: arrayNum, color: "#FFCC00", }; else { colors = { num: arrayNum, color: "#13BB51", }; } } else { var minOfData = Math.min(...diagramData); var maxOfData = Math.max(...diagramData); var quarter = Math.round((maxOfData - minOfData) / 3); if (arrayNum == null) { colors = { num: arrayNum, color: "#B2B1B9", }; } else if (arrayNum <= minOfData + quarter) colors = { num: arrayNum, color: "#FF0000", }; else if (arrayNum < maxOfData - quarter) colors = { num: arrayNum, color: "#FFCC00", }; else colors = { num: arrayNum, color: "#13BB51", }; } return colors; } } function fillColorMap(featureRow, diagramData) { for (let i = 0; i < diagramData.length; i++) { if (i == featureRow) { return diagramData[i]; } } } function onEachFeature(feature, featureLayer) { //yasiu eachfeature.push(featureLayer); if (currentActionId == DANGER_POINTS_ID) { featureLayer.on({ mouseover: highlightMapFeature, mouseout: resetMapFeatureHighlight, }); } else { featureLayer.on({ mouseover: highlightMapFeature, mouseout: resetMapFeatureHighlight, click: zoomMapToFeatureByClick, }); } } async function zoomMapToFeature(e) { removeFeaturesCity(); let featureLayer = e.target ?? e; let featuresLayerCity = []; MapBi.flyToBounds(featureLayer.getBounds()); removeFeaturesFromMap(); fullCityGeoJSONTemp.type = "FeatureCollection"; $.each(fullCityGeoJSON.features, function (key, value) { if ( value && featureLayer.feature.properties.province_id === value.properties.province_id ) { featuresLayerCity.push(value); } else { // } }); fullCityGeoJSONTemp.features = featuresLayerCity; addCityFeaturesToMap(fullCityGeoJSONTemp); flagProvince = 1; iranCityCount = 0; } async function zoomMapToFeatureByClick(e) { currentFilterProvince = e.target.feature.properties.province_id; $("#filter-province").val(currentFilterProvince); getCitiesByProvince(currentFilterProvince); //call lifeCycle lifeCycle({ sync: false, event: "onClickMap", target: e.target ?? target, }); } function showCitiesTileOnMap(target) { removeFeaturesCity(); let featureLayer = target; let featuresLayerCity = []; MapBi.flyToBounds(featureLayer.getBounds()); removeFeaturesFromMap(); fullCityGeoJSONTemp.type = "FeatureCollection"; $.each(fullCityGeoJSON.features, function (key, value) { if ( value && featureLayer.feature.properties.province_id === value.properties.province_id ) { featuresLayerCity.push(value); } else { // } }); fullCityGeoJSONTemp.features = featuresLayerCity; addCityFeaturesToMap(); flagProvince = 1; iranCityCount = 0; } function addCityFeaturesToMap() { showLegendOnMap(curentValueCity); keepMapFeatureColor = null; if (fullCityGeoJSONTemp) { iranCityMapGeo = L.geoJson(fullCityGeoJSONTemp, { style: initStyleCityMapFeatures, onEachFeature: onEachCityFeature, }); iranCityMapGeo.addTo(MapBi); } } function initStyleCityMapFeatures(feature) { let getRandom = getRandomFeatureColor(fillcolorCity(iranCityCount)); let makeStyle = { fillColor: getRandom.color, weight: 2, opacity: 1, color: "white", fillOpacity: 0.5, }; if (iranCityCount == fullCityGeoJSONTemp.features.length) { iranCityCount = 0; } iranCityCount++; return makeStyle; } function getRandomFeatureColor(arrayNum) { if (keepMapFeatureColor) { return { num: -1, color: keepMapFeatureColor, }; } else { var colors = {}; if (currentActionId == RAHDARI_PROJECTS_ID) { if (arrayNum.keyvalue == null) { colors = { num: arrayNum.keyvalue, color: "#B2B1B9", }; } else if (arrayNum.keyvalue <= 40) colors = { num: arrayNum.keyvalue, color: "#FF0000", }; else if (arrayNum.keyvalue < 70) colors = { num: arrayNum.keyvalue, color: "#FFCC00", }; else colors = { num: arrayNum.keyvalue, color: "#13BB51", }; } else { var minOfData = Math.min(...curentValueCity); var maxOfData = Math.max(...curentValueCity); var quarter = Math.round((maxOfData - minOfData) / 3); if (arrayNum.keyvalue == null) { colors = { num: arrayNum.keyvalue, color: "#B2B1B9", }; } else if (arrayNum.keyvalue <= minOfData + quarter) colors = { num: arrayNum.keyvalue, color: "#FF0000", }; else if (arrayNum.keyvalue < maxOfData - quarter) colors = { num: arrayNum.keyvalue, color: "#FFCC00", }; else colors = { num: arrayNum.keyvalue, color: "#13BB51", }; } return colors; } } function fillcolorCity(featureRow) { for (let i = 0; i < fullCityGeoJSONTemp.features.length; i++) { if (i == featureRow) { for (let j = 0; j < curentCityArray.length; j++) { if ( curentCityArray[j].namevalue == fullCityGeoJSONTemp.features[i].properties.city_id ) { CityArraySelected.push(curentCityArray[j]); return curentCityArray[j]; } } } } } function onEachCityFeature(feature, featureLayer) { featureLayer.on({ mouseover: highlightMapFeature, mouseout: resetMapFeatureHighlight, }); } function highlightMapFeature(e) { let targetAtt = e.target.feature.properties; let featureLayer = null; if (e.target) { featureLayer = e.target; } else { featureLayer = e; } keepMapFeatureColor = featureLayer.options.fillColor; featureLayer.setStyle({ weight: 4, color: "#666", fillOpacity: 0.5, }); if (!L.Browser.ie && !L.Browser.opera && !L.Browser.edge) { featureLayer.bringToFront(); } if (currentFilterProvince == 0 && allCityFlag == 0) { for (let i = 0; i < provinces.length; i++) { if (targetAtt.province_id == provinces[i].id) { var value = currentActionId == RAHDARI_PROJECTS_ID ? `%${diagramData[i]}` : diagramData[i]; if (diagramData[i] != null) { popup .setLatLng([provinces[i].center_lat, provinces[i].center_long]) .setContent( `
راهنمای نقشه
${minNum} تا ${firstQuarter}
${firstQuarter} تا ${secondQuarter}
${secondQuarter} تا ${maxNum}
`); }