diff --git a/web/assets/js/bs5.dashboard-base.js b/web/assets/js/bs5.dashboard-base.js
index e2e405c3..218b8b98 100644
--- a/web/assets/js/bs5.dashboard-base.js
+++ b/web/assets/js/bs5.dashboard-base.js
@@ -106,6 +106,9 @@ function addCredentialsToUrl(streamUrl,username,password){
const urlParts = streamUrl.split('://')
return [urlParts[0],'://',`${username}:${password}@`,urlParts[1]].join('')
}
+function mergeConcattedJsonString(textData){
+ return textData.replace(/[\r\n]/gm, '').replace('}{',',')
+}
function getFullOrigin(withoutTrailingSlash){
var url = location.origin + getLocationPathName()
if(withoutTrailingSlash)url = url.slice(0, -1);
diff --git a/web/assets/js/bs5.monitorSettings.js b/web/assets/js/bs5.monitorSettings.js
index 089280a7..4afc4ffe 100644
--- a/web/assets/js/bs5.monitorSettings.js
+++ b/web/assets/js/bs5.monitorSettings.js
@@ -977,37 +977,6 @@ monitorEditorWindow.on('change','[channel-detail]',function(){
monitorEditorWindow.find('.probe-monitor-settings').click(function(){
$.pB.submit(buildMonitorURL(),true)
})
-monitorEditorWindow.find('.import_config').click(function(e){
- var el = $(this);
- var monitorId = el.parents('[mid]').attr('mid');
- $.confirm.create({
- title: lang['Import Monitor Configuration'],
- body: lang.ImportMonitorConfigurationText+'
',
- clickOptions: {
- title: 'Import',
- class: 'btn-primary'
- },
- clickCallback: function(){
- try{
- var monitorConfig = safeJsonParse($.confirm.e.find('textarea').val());
- importIntoMonitorEditor(monitorConfig)
- monitorEditorWindow.modal('show')
- }catch(err){
- debugLog(err)
- new PNotify({title:lang['Invalid JSON'],text:lang.InvalidJSONText,type:'error'})
- }
- }
- })
- $.confirm.e.find('.upload').change(function(e){
- var files = e.target.files; // FileList object
- f = files[0];
- var reader = new FileReader();
- reader.onload = function(ee) {
- $.confirm.e.find('textarea').val(ee.target.result);
- }
- reader.readAsText(f);
- });
-});
monitorEditorWindow.find('.save_config').click(function(e){
//export monior config in view
var el = $(this);
@@ -1438,10 +1407,12 @@ editorForm.find('[name="type"]').change(function(e){
launchImportMonitorWindow(function(monitor){
var monitorConfig = null
if(monitor.monitor){
+ mergeZoneMinderZonesIntoMonitors(monitor)
monitorConfig = importZoneMinderMonitor(monitor.monitor.Monitor)
}else
//zoneminder multiple monitors
if(monitor.monitors){
+ mergeZoneMinderZonesIntoMonitors(monitor)
monitorConfig = importZoneMinderMonitor(monitor.monitors[0].Monitor)
}else{
if(monitor[0] && monitor.mid){
diff --git a/web/assets/js/bs5.monitorsUtils.js b/web/assets/js/bs5.monitorsUtils.js
index 8bae53e6..de54c6a3 100644
--- a/web/assets/js/bs5.monitorsUtils.js
+++ b/web/assets/js/bs5.monitorsUtils.js
@@ -332,7 +332,50 @@ function importM3u8Playlist(textData){
postMonitor(newMon)
})
}
-
+function convertZoneMinderZonesToCords(rows,width,height){
+ var coordinates = {}
+ const defaultDetectionWidth = 640
+ const defaultDetectionHeight = 480
+ rows.forEach((row) => {
+ const zone = row.Zone || row
+ let widthRatio = width > defaultDetectionWidth ? defaultDetectionWidth / width : 1
+ let heightRatio = height > defaultDetectionHeight ? defaultDetectionHeight / height : 1
+ const points = zone.Coords.split(' ').map((item) => {
+ let points = item.split(',').map((num) => parseInt(num));
+ points[0] = parseInt(points[0] * widthRatio);
+ points[1] = parseInt(points[1] * heightRatio);
+ return points
+ })
+ const monitorId = zone.MonitorId
+ coordinates[generateId(5)] = {
+ "name": `${zone.Id}-${monitorId}`,
+ "sensitivity": "5",
+ "max_sensitivity": "",
+ "threshold": 1,
+ "color_threshold": 9,
+ "points": points
+ }
+ })
+ return coordinates
+}
+function mergeZoneMinderZonesIntoMonitors(data){
+ const monitors = data.monitors
+ const singleMonitor = data.monitor && data.monitor.Monitor ? data.monitor.Monitor : null
+ const zones = data.zones
+ const targetMonitors = singleMonitor ? [singleMonitor] : monitors
+ targetMonitors.forEach((row) => {
+ const monitor = row.Monitor
+ const width = parseInt(monitor.Width)
+ const height = parseInt(monitor.Height)
+ const monitorZones = zones.filter(zone => {
+ return zone.Zone.MonitorId === monitor.Id
+ })
+ monitor.Zones = convertZoneMinderZonesToCords(monitorZones,width,height) || {}
+ })
+ if(singleMonitor){
+ data.monitor.Monitor = targetMonitors[0]
+ }
+}
function importZoneMinderMonitor(Monitor){
var newMon = generateDefaultMonitorSettings()
newMon.details = safeJsonParse(newMon.details)
@@ -356,7 +399,11 @@ function importZoneMinderMonitor(Monitor){
newMon.details.mpass = password
newMon.details.stream_type = 'hls'
newMon.details.detector_buffer_acodec = 'auto'
+ // newMon.details.detector_scale_x = '640'
newMon.type = 'h264'
+ if(Monitor.Zones){
+ newMon.details.cords = JSON.stringify(Monitor.Zones)
+ }
switch(Monitor.Function){
case'None':
// The monitor is currently disabled.
@@ -428,7 +475,7 @@ function importZoneMinderMonitor(Monitor){
function importMonitor(textData){
try{
- var parsedData = textData instanceof Object ? textData : safeJsonParse(textData)
+ var parsedData = textData instanceof Object ? textData : safeJsonParse(mergeConcattedJsonString(textData))
function postMonitor(v){
var monitorId = v.mid
$.post(`${getApiPrefix('configureMonitor')}/${monitorId}`,{
@@ -439,10 +486,12 @@ function importMonitor(textData){
}
//zoneminder one monitor
if(parsedData.monitor){
+ mergeZoneMinderZonesIntoMonitors(parsedData)
postMonitor(importZoneMinderMonitor(parsedData.monitor.Monitor))
}else
//zoneminder multiple monitors
if(parsedData.monitors){
+ mergeZoneMinderZonesIntoMonitors(parsedData)
$.each(parsedData.monitors,function(n,v){
postMonitor(importZoneMinderMonitor(v.Monitor))
})
@@ -525,7 +574,7 @@ function launchImportMonitorWindow(callback){
title: lang['Import'],
class: 'btn-primary',
callback: function(){
- var textData = safeJsonParse($.confirm.e.find('textarea').val())
+ var textData = safeJsonParse(mergeConcattedJsonString($.confirm.e.find('textarea').val()))
if(callback){
callback(textData)
}else{