From 8343793c48794f4be25e417d64abc76996ef9735 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 6 Feb 2018 11:34:40 -0500 Subject: [PATCH 01/16] Fix updating Storage area DiskSpace by using COALESCE --- db/zm_update-1.31.37.sql | 49 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 db/zm_update-1.31.37.sql diff --git a/db/zm_update-1.31.37.sql b/db/zm_update-1.31.37.sql new file mode 100644 index 000000000..0d66e0282 --- /dev/null +++ b/db/zm_update-1.31.37.sql @@ -0,0 +1,49 @@ +DROP PROCEDURE IF EXISTS update_storage_stats; + +DELIMITER // + +CREATE PROCEDURE update_storage_stats(IN StorageId smallint(5), IN space BIGINT) + +sql security invoker + +deterministic + +begin + + update Storage set DiskSpace = COALESCE(DiskSpace,0) + COALESCE(space,0) where Id = StorageId; + +end; + +// + +DROP TRIGGER IF EXISTS event_delete_trigger// + +CREATE TRIGGER event_delete_trigger BEFORE DELETE ON Events +FOR EACH ROW + BEGIN + IF ( OLD.DiskSpace ) THEN + call update_storage_stats(OLD.StorageId, -OLD.DiskSpace); + END IF; + DELETE FROM Events_Hour WHERE EventId=OLD.Id; + DELETE FROM Events_Day WHERE EventId=OLD.Id; + DELETE FROM Events_Week WHERE EventId=OLD.Id; + DELETE FROM Events_Month WHERE EventId=OLD.Id; + IF ( OLD.Archived ) THEN + DELETE FROM Events_Archived WHERE EventId=OLD.Id; + UPDATE Monitors SET + ArchivedEvents = ArchivedEvents - 1, + ArchivedEventDiskSpace = COALESCE(ArchivedEventDiskSpace,0) - COALESCE(OLD.DiskSpace,0), + TotalEvents = TotalEvents - 1, + TotalEventDiskSpace = COALESCE(TotalEventDiskSpace,0) - COALESCE(OLD.DiskSpace,0) + WHERE Id=OLD.MonitorId; + ELSE + UPDATE Monitors SET + TotalEvents = TotalEvents-1, + TotalEventDiskSpace=COALESCE(TotalEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0) + WHERE Id=OLD.MonitorId; + END IF; + END; + +// + +UPDATE Storage SET DiskSpace=(SELECT SUM(DiskSpace) FROM Events WHERE StorageId=Storage.Id)// From 4c5e47b0505419b91dad68fb588f0e6cc9f5a148 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 7 Feb 2018 08:02:05 -0500 Subject: [PATCH 02/16] fix DiskSpace summing when Nulls are present --- db/zm_create.sql.in | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/db/zm_create.sql.in b/db/zm_create.sql.in index ecb3fe0dc..fe05585e4 100644 --- a/db/zm_create.sql.in +++ b/db/zm_create.sql.in @@ -409,7 +409,7 @@ deterministic begin - update Storage set DiskSpace = DiskSpace + space where Id = StorageId; + update Storage set DiskSpace = COALESCE(DiskSpace,0) + COALESCE(space,0) where Id = StorageId; end; @@ -496,7 +496,9 @@ DROP TRIGGER IF EXISTS event_delete_trigger// CREATE TRIGGER event_delete_trigger BEFORE DELETE ON Events FOR EACH ROW BEGIN - call update_storage_stats(OLD.StorageId, -OLD.DiskSpace); + IF ( OLD.DiskSpace ) THEN + call update_storage_stats(OLD.StorageId, -OLD.DiskSpace); + END IF; DELETE FROM Events_Hour WHERE EventId=OLD.Id; DELETE FROM Events_Day WHERE EventId=OLD.Id; DELETE FROM Events_Week WHERE EventId=OLD.Id; From 069d53a9a005b38d3d4c566306d47e7d77fcc87f Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 7 Feb 2018 08:02:37 -0500 Subject: [PATCH 03/16] Add the object debug when path to event does not exist in DiskSpace --- scripts/ZoneMinder/lib/ZoneMinder/Event.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Event.pm b/scripts/ZoneMinder/lib/ZoneMinder/Event.pm index 766436a84..0eb9e2763 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Event.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Event.pm @@ -470,7 +470,7 @@ sub DiskSpace { $_[0]{DiskSpace} = $size; Debug("DiskSpace for event $_[0]{Id} at $_[0]{Path} Updated to $size bytes"); } else { - Warning("Event does not exist at $_[0]{Path}"); + Warning("DiskSpace: Event does not exist at $_[0]{Path}:" . $Event->to_string() ); } } # end if ! defined DiskSpace return $_[0]{DiskSpace}; From 0d5c8f385f93223682b6081c632276a8988f4c09 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 7 Feb 2018 08:02:49 -0500 Subject: [PATCH 04/16] fix DiskSpace summing when Nulls are present --- db/zm_update-1.31.37.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/zm_update-1.31.37.sql b/db/zm_update-1.31.37.sql index 0d66e0282..866fd9330 100644 --- a/db/zm_update-1.31.37.sql +++ b/db/zm_update-1.31.37.sql @@ -46,4 +46,4 @@ FOR EACH ROW // -UPDATE Storage SET DiskSpace=(SELECT SUM(DiskSpace) FROM Events WHERE StorageId=Storage.Id)// +UPDATE Storage SET DiskSpace=(SELECT SUM(COALESCE(DiskSpace,0)) FROM Events WHERE StorageId=Storage.Id)// From cd606dbab805ddba406d678bab9089736417602c Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 7 Feb 2018 08:03:01 -0500 Subject: [PATCH 05/16] whitespace --- src/zm_monitor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index 9bec8467d..e149a78f6 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -1204,7 +1204,7 @@ bool Monitor::Analyse() { if ( image_count && fps_report_interval && !(image_count%fps_report_interval) ) { double new_fps = double(fps_report_interval)/(now.tv_sec - last_fps_time); - Info( "%s: %d - Analysing at %.2f fps", name, image_count, new_fps ); + Info("%s: %d - Analysing at %.2f fps", name, image_count, new_fps); if ( fps != new_fps ) { fps = new_fps; static char sql[ZM_SQL_SML_BUFSIZ]; From b119f7d7314eb3634078d985c77ce44f03436315 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 7 Feb 2018 08:03:19 -0500 Subject: [PATCH 06/16] bump version --- version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version b/version index c2db3b3d2..c6e42f25b 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.31.36 +1.31.37 From dec82ecf5c119a15ec345c761960f8565bf258a9 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 7 Feb 2018 09:07:51 -0500 Subject: [PATCH 07/16] Fix for when specifying page 1 and no pages --- web/skins/classic/views/events.php | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/web/skins/classic/views/events.php b/web/skins/classic/views/events.php index 0636eb3cf..d9e9d423f 100644 --- a/web/skins/classic/views/events.php +++ b/web/skins/classic/views/events.php @@ -48,24 +48,19 @@ Error("No filtering in events, will load ALL!"); } $eventsSql .= " ORDER BY $sortColumn $sortOrder"; -if ( isset($_REQUEST['page']) ) - $page = validInt($_REQUEST['page']); -else - $page = 0; -if ( isset($_REQUEST['limit']) ) - $limit = validInt($_REQUEST['limit']); -else - $limit = 0; +$page = isset($_REQUEST['page']) ? validInt($_REQUEST['page']) : 0; +$limit = isset($_REQUEST['limit']) ? validInt($_REQUEST['limit']) : 0; $nEvents = dbFetchOne( $countSql, 'EventCount' ); if ( !empty($limit) && $nEvents > $limit ) { $nEvents = $limit; } $pages = (int)ceil($nEvents/ZM_WEB_EVENTS_PER_PAGE); +#Logger::Debug("Page $page Limit $limit #vents: $nEvents pages: $pages "); if ( !empty($page) ) { if ( $page < 0 ) $page = 1; - else if ( $page > $pages ) + else if ( $pages and ( $page > $pages ) ) $page = $pages; $limitStart = (($page-1)*ZM_WEB_EVENTS_PER_PAGE); From f6bb3017efc0b610da98c7243f6c6d0322ee971d Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 8 Feb 2018 07:49:52 -0500 Subject: [PATCH 08/16] Use absolute patch to point-g.png. Makes the assumption that /zm always works. --- web/skins/classic/css/base/views/zone.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/css/base/views/zone.css b/web/skins/classic/css/base/views/zone.css index 6b35ca287..c2feb6734 100644 --- a/web/skins/classic/css/base/views/zone.css +++ b/web/skins/classic/css/base/views/zone.css @@ -52,11 +52,11 @@ } #imageFrame div { - background-image: url(../../../graphics/point-g.png); + background-image: url(/zm/skins/classic/graphics/point-g.png); } #imageFrame div.highlight { - background-image: url(../../../graphics/point-o.png); + background-image: url(/zm/skins/classic/graphics/point-o.png); } #imageFrame div.active { From babae4629a97340dca6d4d869f8f8fb64aa4f04c Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 8 Feb 2018 09:47:16 -0500 Subject: [PATCH 09/16] Update and fix console buttons. Use a separate button for clone --- web/skins/classic/views/console.php | 23 ++++++++++----- web/skins/classic/views/js/console.js | 36 +++++++++++++++-------- web/skins/classic/views/js/console.js.php | 2 -- 3 files changed, 40 insertions(+), 21 deletions(-) diff --git a/web/skins/classic/views/console.php b/web/skins/classic/views/console.php index 10a0be72a..250dcf928 100644 --- a/web/skins/classic/views/console.php +++ b/web/skins/classic/views/console.php @@ -291,13 +291,22 @@ for( $monitor_i = 0; $monitor_i < count($displayMonitors); $monitor_i += 1 ) { - - - - - + + + + 1 ) - break; - } + // We want to know if 1 or more monitors are checked + for ( var i=0; i < form.elements.length; i++ ) { + if ( + form.elements[i].type=="checkbox" + && + form.elements[i].name=="markMids[]" + && + form.elements[i].checked + ) { + if ( checked++ > 1 ) + break; } } $(element).closest("tr").toggleClass("danger"); - form.editBtn.disabled = checked ? false : true; - form.addBtn.value = (checked==1) ? jsTranslatedCloneText:jsTranslatedAddText; - - form.deleteBtn.disabled = (checked==0); + if ( checked ) { + form.editBtn.disabled = false; + form.deleteBtn.disabled = false; + if ( checked == 1 ) { + $j(form.cloneBtn).css('display','inline'); + } else { + form.cloneBtn.hide(); + } + } else { + form.cloneBtn.hide(); + form.editBtn.disabled = true; + form.deleteBtn.disabled = true; + } } function addMonitor(element) { diff --git a/web/skins/classic/views/js/console.js.php b/web/skins/classic/views/js/console.js.php index 006cfc565..f5e65332d 100644 --- a/web/skins/classic/views/js/console.js.php +++ b/web/skins/classic/views/js/console.js.php @@ -18,5 +18,3 @@ if ( ZM_CHECK_FOR_UPDATES && canEdit('System') && ZM_DYN_LAST_VERSION && ( verNu ?> var showVersionPopup = ; var showDonatePopup = ; -var translatedAddText = ""; -var translatedCloneText = ""; From cfe53c0ffedbf2f10ba984d276ee0319a02f8cd5 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 8 Feb 2018 09:57:11 -0500 Subject: [PATCH 10/16] Explicitly set the danger class on each line because they can get out of sync when using the All toggle --- web/skins/classic/views/js/console.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/web/skins/classic/views/js/console.js b/web/skins/classic/views/js/console.js index e4bf24258..b6d08e525 100644 --- a/web/skins/classic/views/js/console.js +++ b/web/skins/classic/views/js/console.js @@ -2,20 +2,21 @@ function setButtonStates( element ) { var form = element.form; var checked = 0; - // We want to know if 1 or more monitors are checked for ( var i=0; i < form.elements.length; i++ ) { if ( form.elements[i].type=="checkbox" && form.elements[i].name=="markMids[]" - && - form.elements[i].checked ) { - if ( checked++ > 1 ) - break; + var tr = $j(form.elements[i]).closest("tr"); + if ( form.elements[i].checked ) { + checked ++; + tr.addClass("danger"); + } else { + tr.removeClass("danger"); + } } } - $(element).closest("tr").toggleClass("danger"); if ( checked ) { form.editBtn.disabled = false; form.deleteBtn.disabled = false; @@ -87,8 +88,6 @@ function reloadWindow() { } function initPage() { - jsTranslatedAddText = translatedAddText; - jsTranslatedCloneText = translatedCloneText; reloadWindow.periodical( consoleRefreshTimeout ); if ( showVersionPopup ) createPopup( '?view=version', 'zmVersion', 'version' ); @@ -96,7 +95,7 @@ function initPage() { createPopup( '?view=donate', 'zmDonate', 'donate' ); // Makes table sortable -$j( function() { + $j( function() { $j( "#consoleTableBody" ).sortable({ handle: ".glyphicon-sort", update: applySort, From f987bde6df507df42f97f23d58025c149bc936aa Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 8 Feb 2018 09:28:52 -0800 Subject: [PATCH 11/16] fix styles on montagereview. Mostly remove borders and make timelineDiv 100% --- web/skins/classic/css/base/views/montagereview.css | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/css/base/views/montagereview.css b/web/skins/classic/css/base/views/montagereview.css index e82e5ae95..4fb55a337 100644 --- a/web/skins/classic/css/base/views/montagereview.css +++ b/web/skins/classic/css/base/views/montagereview.css @@ -2,7 +2,6 @@ #SpeedDiv{ vertical-align: top; display: inline-flex; - border: 1px solid black; width: 25%; padding: 4px; } @@ -10,6 +9,14 @@ #SpeedDiv label { margin: 0; } +#ButtonsDiv { + display: inline-flex; + flex-flow: row-wrap; +} +#ButtonsDiv button { +display: inline-flex; +min-width: 0; +} #DateTimeDiv { display: inline-flex; } @@ -23,7 +30,7 @@ #timelinediv { margin: 2px auto; position:relative; - width:93%; + width:100%; } #timeline { From 16604e3ee495ca248cb63cfd358e5bbe6cff6d2a Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 8 Feb 2018 09:29:12 -0800 Subject: [PATCH 12/16] fix including jquery in export --- web/skins/classic/includes/export_functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/includes/export_functions.php b/web/skins/classic/includes/export_functions.php index 246554564..5d23b1125 100644 --- a/web/skins/classic/includes/export_functions.php +++ b/web/skins/classic/includes/export_functions.php @@ -72,7 +72,7 @@ html ul.tabs li.active, html ul.tabs li.active a:hover { --> @@ -140,7 +141,11 @@ echo output_link_if_exists( array( + + Date: Thu, 8 Feb 2018 09:29:54 -0800 Subject: [PATCH 14/16] increase download popup height --- web/skins/classic/js/base.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/js/base.js b/web/skins/classic/js/base.js index 470cfc792..4bbe8c19b 100644 --- a/web/skins/classic/js/base.js +++ b/web/skins/classic/js/base.js @@ -33,7 +33,7 @@ var popupSizes = { 'device': { 'width': 260, 'height': 150 }, 'devices': { 'width': 400, 'height': 240 }, 'donate': { 'width': 500, 'height': 280 }, - 'download': { 'width': 350, 'height': 215 }, + 'download': { 'width': 350, 'height': 315 }, 'event': { 'addWidth': 108, 'minWidth': 496, 'addHeight': 230, 'minHeight': 540 }, 'eventdetail': { 'width': 600, 'height': 420 }, 'events': { 'width': 1220, 'height': 780 }, From 4240dc4bde0b97ac720f8f87a12b26cc5ba63d88 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 8 Feb 2018 09:30:26 -0800 Subject: [PATCH 15/16] spacing, add a test for minTime being after maxTime --- web/skins/classic/views/js/montagereview.js | 188 +++++++++++--------- 1 file changed, 102 insertions(+), 86 deletions(-) diff --git a/web/skins/classic/views/js/montagereview.js b/web/skins/classic/views/js/montagereview.js index a07a0ccc6..63fce8910 100644 --- a/web/skins/classic/views/js/montagereview.js +++ b/web/skins/classic/views/js/montagereview.js @@ -49,28 +49,28 @@ function SetImageSource( monId, time ) { if ( liveMode == 1 ) { return monitorImageObject[monId].src.replace(/rand=\d+/i, 'rand='+Math.floor((Math.random() * 1000000) )); - } else { - for ( var i=0, eIdlength = eId.length; i < eIdlength; i++ ) { - // Search for the event matching this time. Would be more efficient if we had events indexed by monitor - if ( eMonId[i] == monId && time >= eStartSecs[i] && time <= eEndSecs[i] ) { - var duration = eEndSecs[i]-eStartSecs[i]; - var frame = parseInt((time - eStartSecs[i])/(duration)*eventFrames[i])+1; - var storage = Storage[eStorageId[i]]; - if ( storage.ServerId ) { - var server = Servers[storage.ServerId]; - if ( server ) { -//console.log( server.Hostname + " for event " + eId[i] ); - return location.protocol + '//' + server.Hostname + '/index.php?view=image&eid=' + eId[i] + '&fid='+frame + "&width=" + monitorCanvasObj[monId].width + "&height=" + monitorCanvasObj[monId].height; - } else { - console.log("No server found for " + storage.ServerId ); - } - } - //console.log("No storage found for " + eStorageId[i] ); - return "index.php?view=image&eid=" + eId[i] + '&fid='+frame + "&width=" + monitorCanvasObj[monId].width + "&height=" + monitorCanvasObj[monId].height; - } - } // end for - return "no data"; } + + for ( var i=0, eIdlength = eId.length; i < eIdlength; i++ ) { + // Search for the event matching this time. Would be more efficient if we had events indexed by monitor + if ( eMonId[i] == monId && time >= eStartSecs[i] && time <= eEndSecs[i] ) { + var duration = eEndSecs[i]-eStartSecs[i]; + var frame = parseInt((time - eStartSecs[i])/(duration)*eventFrames[i])+1; + var storage = Storage[eStorageId[i]]; + if ( storage.ServerId ) { + var server = Servers[storage.ServerId]; + if ( server ) { +//console.log( server.Hostname + " for event " + eId[i] ); + return location.protocol + '//' + server.Hostname + '/index.php?view=image&eid=' + eId[i] + '&fid='+frame + "&width=" + monitorCanvasObj[monId].width + "&height=" + monitorCanvasObj[monId].height; + } else { + console.log("No server found for " + storage.ServerId ); + } + } + //console.log("No storage found for " + eStorageId[i] ); + return "index.php?view=image&eid=" + eId[i] + '&fid='+frame + "&width=" + monitorCanvasObj[monId].width + "&height=" + monitorCanvasObj[monId].height; + } + } // end for + return "no data"; } // callback when loading an image. Will load itself to the canvas, or draw no data @@ -164,7 +164,7 @@ function loadImage2Monitor( monId, url ) { function timerFire() { // See if we need to reschedule - if ( currentDisplayInterval != timerInterval || currentSpeed == 0 ) { + if ( ( currentDisplayInterval != timerInterval ) || ( currentSpeed == 0 ) ) { // zero just turn off interrupts clearInterval(timerObj); timerInterval=currentDisplayInterval; @@ -335,60 +335,61 @@ function drawGraph() { } function redrawScreen() { - if ( liveMode == 1 ) { + if ( liveMode == 1 ) { // if we are not in live view switch to history -- this has to come before fit in case we re-establish the timeline - $('DateTimeDiv').style.display="none"; - $('SpeedDiv').style.display="none"; - $('timelinediv').style.display="none"; - $('live').innerHTML="History"; - $('zoomin').style.display="none"; - $('zoomout').style.display="none"; - $('panleft').style.display="none"; - $('panright').style.display="none"; - if ($('downloadVideo')) $('downloadVideo').style.display="none"; + $('DateTimeDiv').style.display="none"; + $('SpeedDiv').style.display="none"; + $('timelinediv').style.display="none"; + $('live').innerHTML="History"; + $('zoomin').style.display="none"; + $('zoomout').style.display="none"; + $('panleft').style.display="none"; + $('panright').style.display="none"; + if ($('downloadVideo')) $('downloadVideo').style.display="none"; - } else { + } else { // switch out of liveview mode - $('DateTimeDiv').style.display="inline"; - $('SpeedDiv').style.display="inline"; - $('SpeedDiv').style.display="inline-flex"; - $('timelinediv').style.display=null; - $('live').innerHTML="Live"; - $('zoomin').style.display="inline"; - $('zoomin').style.display="inline-flex"; - $('zoomout').style.display="inline"; - $('zoomout').style.display="inline-flex"; - $('panleft').style.display="inline"; - $('panleft').style.display="inline-flex"; - $('panright').style.display="inline"; - $('panright').style.display="inline-flex"; - if ($('downloadVideo')) $('downloadVideo').style.display="inline"; - } + $('DateTimeDiv').style.display="inline"; + $('DateTimeDiv').style.display="inline-flex"; + $('SpeedDiv').style.display="inline"; + $('SpeedDiv').style.display="inline-flex"; + $('timelinediv').style.display=null; + $('live').innerHTML="Live"; + $('zoomin').style.display="inline"; + $('zoomin').style.display="inline-flex"; + $('zoomout').style.display="inline"; + $('zoomout').style.display="inline-flex"; + $('panleft').style.display="inline"; + $('panleft').style.display="inline-flex"; + $('panright').style.display="inline"; + $('panright').style.display="inline-flex"; + if ($('downloadVideo')) $('downloadVideo').style.display="inline"; + } - if ( fitMode == 1 ) { - $('ScaleDiv').style.display="none"; - $('fit').innerHTML="Scale"; - var vh=window.innerHeight; - var vw=window.innerWidth; - var pos=$('monitors').getPosition(); - var mh=(vh - pos.y - $('fps').getSize().y); - $('monitors').setStyle('height',mh.toString() + "px"); // leave a small gap at bottom - if(maxfit2($('monitors').getSize().x,$('monitors').getSize().y) == 0) /// if we fail to fix we back out of fit mode -- ??? This may need some better handling - fitMode=1-fitMode; - } else { - // switch out of fit mode - // if we fit, then monitors were absolutely positioned already (or will be) otherwise release them to float - for( var i=0; i Date: Thu, 8 Feb 2018 09:30:48 -0800 Subject: [PATCH 16/16] give the buttons div an id and move the styling into the css --- web/skins/classic/views/montagereview.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/views/montagereview.php b/web/skins/classic/views/montagereview.php index bc8f82b99..031de0896 100644 --- a/web/skins/classic/views/montagereview.php +++ b/web/skins/classic/views/montagereview.php @@ -232,7 +232,7 @@ xhtmlHeaders(__FILE__, translate('MontageReview') ); fps -
+