mirror of
https://github.com/scottlamb/moonfire-nvr.git
synced 2025-02-04 18:36:00 -05:00
Fix a whole bunch of eslint errors
These apparently were silent until 92c532d mass-upgraded deps. Apparently eslint returned status 0 despite errors before and now returns 1. Most of these were handled by its "--fix" option; I manually took care of the remaining two: /Users/slamb/git/moonfire-nvr/ui-src/lib/views/RecordingsView.js 140:1 error This line has a length of 82. Maximum allowed is 80 max-len /Users/slamb/git/moonfire-nvr/ui-src/lib/views/StreamSelectorView.js 72:1 error This line has a length of 82. Maximum allowed is 80 max-len
This commit is contained in:
parent
92c532db3e
commit
aa25a85477
@ -72,7 +72,7 @@ let loginDialog = null;
|
|||||||
*
|
*
|
||||||
* @type {String}
|
* @type {String}
|
||||||
*/
|
*/
|
||||||
let timeFmt = 'YYYY-MM-DD HH:mm:ss';
|
const timeFmt = 'YYYY-MM-DD HH:mm:ss';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Currently active time formatter.
|
* Currently active time formatter.
|
||||||
@ -128,24 +128,24 @@ function onSelectVideo(nvrSettingsView, camera, streamType, range, recording) {
|
|||||||
console.log('Recording clicked: ', recording);
|
console.log('Recording clicked: ', recording);
|
||||||
const trimmedRange = recording.range90k(nvrSettingsView.trim ? range : null);
|
const trimmedRange = recording.range90k(nvrSettingsView.trim ? range : null);
|
||||||
const url = api.videoPlayUrl(
|
const url = api.videoPlayUrl(
|
||||||
camera.uuid,
|
camera.uuid,
|
||||||
streamType,
|
streamType,
|
||||||
recording,
|
recording,
|
||||||
trimmedRange,
|
trimmedRange,
|
||||||
nvrSettingsView.timeStampTrack
|
nvrSettingsView.timeStampTrack
|
||||||
);
|
);
|
||||||
const [
|
const [
|
||||||
formattedStart,
|
formattedStart,
|
||||||
formattedEnd,
|
formattedEnd,
|
||||||
] = timeFormatter90k.formatSameDayShortened(
|
] = timeFormatter90k.formatSameDayShortened(
|
||||||
trimmedRange.startTime90k,
|
trimmedRange.startTime90k,
|
||||||
trimmedRange.endTime90k
|
trimmedRange.endTime90k
|
||||||
);
|
);
|
||||||
const videoTitle =
|
const videoTitle =
|
||||||
camera.shortName + ', ' + formattedStart + ' to ' + formattedEnd;
|
camera.shortName + ', ' + formattedStart + ' to ' + formattedEnd;
|
||||||
new VideoDialogView()
|
new VideoDialogView()
|
||||||
.attach($('body'))
|
.attach($('body'))
|
||||||
.play(videoTitle, recording.videoSampleEntryWidth / 4, url);
|
.play(videoTitle, recording.videoSampleEntryWidth / 4, url);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -159,18 +159,18 @@ function fetch(selectedRange, videoLength) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
console.log(
|
console.log(
|
||||||
'Fetching> ' +
|
'Fetching> ' +
|
||||||
selectedRange.formatTimeStamp90k(selectedRange.startTime90k) +
|
selectedRange.formatTimeStamp90k(selectedRange.startTime90k) +
|
||||||
' to ' +
|
' to ' +
|
||||||
selectedRange.formatTimeStamp90k(selectedRange.endTime90k)
|
selectedRange.formatTimeStamp90k(selectedRange.endTime90k)
|
||||||
);
|
);
|
||||||
for (let streamView of streamViews) {
|
for (const streamView of streamViews) {
|
||||||
let url = api.recordingsUrl(
|
const url = api.recordingsUrl(
|
||||||
streamView.camera.uuid,
|
streamView.camera.uuid,
|
||||||
streamView.streamType,
|
streamView.streamType,
|
||||||
selectedRange.startTime90k,
|
selectedRange.startTime90k,
|
||||||
selectedRange.endTime90k,
|
selectedRange.endTime90k,
|
||||||
videoLength
|
videoLength
|
||||||
);
|
);
|
||||||
if (streamView.recordingsReq !== null) {
|
if (streamView.recordingsReq !== null) {
|
||||||
/*
|
/*
|
||||||
@ -181,7 +181,7 @@ function fetch(selectedRange, videoLength) {
|
|||||||
streamView.recordingsReq.abort();
|
streamView.recordingsReq.abort();
|
||||||
}
|
}
|
||||||
streamView.delayedShowLoading(500);
|
streamView.delayedShowLoading(500);
|
||||||
let r = api.request(url);
|
const r = api.request(url);
|
||||||
streamView.recordingsUrl = url;
|
streamView.recordingsUrl = url;
|
||||||
streamView.recordingsReq = r;
|
streamView.recordingsReq = r;
|
||||||
streamView.recordingsRange = selectedRange.range90k();
|
streamView.recordingsRange = selectedRange.range90k();
|
||||||
@ -189,20 +189,20 @@ function fetch(selectedRange, videoLength) {
|
|||||||
streamView.recordingsReq = null;
|
streamView.recordingsReq = null;
|
||||||
});
|
});
|
||||||
r
|
r
|
||||||
.then(function(data /* , status, req */) {
|
.then(function(data /* , status, req */) {
|
||||||
// Sort recordings in descending order.
|
// Sort recordings in descending order.
|
||||||
data.recordings.sort(function(a, b) {
|
data.recordings.sort(function(a, b) {
|
||||||
return b.startId - a.startId;
|
return b.startId - a.startId;
|
||||||
|
});
|
||||||
|
console.log(
|
||||||
|
'Fetched results for "%s-%s" > updating recordings',
|
||||||
|
streamView.camera.shortName, streamView.streamType
|
||||||
|
);
|
||||||
|
streamView.recordingsJSON = data.recordings;
|
||||||
|
})
|
||||||
|
.catch(function(data, status, err) {
|
||||||
|
console.error(url, ' load failed: ', status, ': ', err);
|
||||||
});
|
});
|
||||||
console.log(
|
|
||||||
'Fetched results for "%s-%s" > updating recordings',
|
|
||||||
streamView.camera.shortName, streamView.streamType
|
|
||||||
);
|
|
||||||
streamView.recordingsJSON = data.recordings;
|
|
||||||
})
|
|
||||||
.catch(function(data, status, err) {
|
|
||||||
console.error(url, ' load failed: ', status, ': ', err);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,21 +213,21 @@ function fetch(selectedRange, videoLength) {
|
|||||||
* or null.
|
* or null.
|
||||||
*/
|
*/
|
||||||
function updateSession(session) {
|
function updateSession(session) {
|
||||||
let sessionBar = $('#session');
|
const sessionBar = $('#session');
|
||||||
sessionBar.empty();
|
sessionBar.empty();
|
||||||
if (session === null || session === undefined) {
|
if (session === null || session === undefined) {
|
||||||
sessionBar.hide();
|
sessionBar.hide();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sessionBar.append($('<span id="session-username" />').text(session.username));
|
sessionBar.append($('<span id="session-username" />').text(session.username));
|
||||||
let logout = $('<a>logout</a>');
|
const logout = $('<a>logout</a>');
|
||||||
logout.click(() => {
|
logout.click(() => {
|
||||||
api
|
api
|
||||||
.logout(session.csrf)
|
.logout(session.csrf)
|
||||||
.done(() => {
|
.done(() => {
|
||||||
onReceivedTopLevel(null);
|
onReceivedTopLevel(null);
|
||||||
loginDialog.dialog('open');
|
loginDialog.dialog('open');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
sessionBar.append(' | ', logout);
|
sessionBar.append(' | ', logout);
|
||||||
sessionBar.show();
|
sessionBar.show();
|
||||||
@ -274,10 +274,10 @@ function onReceivedTopLevel(data) {
|
|||||||
videos.empty();
|
videos.empty();
|
||||||
|
|
||||||
streamViews = [];
|
streamViews = [];
|
||||||
let streamSelectorCameras = [];
|
const streamSelectorCameras = [];
|
||||||
for (const cameraJson of data.cameras) {
|
for (const cameraJson of data.cameras) {
|
||||||
const camera = new Camera(cameraJson);
|
const camera = new Camera(cameraJson);
|
||||||
let cameraStreams = {};
|
const cameraStreams = {};
|
||||||
Object.keys(camera.streams).forEach((streamType) => {
|
Object.keys(camera.streams).forEach((streamType) => {
|
||||||
const sv = new StreamView(
|
const sv = new StreamView(
|
||||||
camera,
|
camera,
|
||||||
@ -288,11 +288,11 @@ function onReceivedTopLevel(data) {
|
|||||||
sv.onRecordingClicked = (recordingModel) => {
|
sv.onRecordingClicked = (recordingModel) => {
|
||||||
console.log('Recording clicked', recordingModel);
|
console.log('Recording clicked', recordingModel);
|
||||||
onSelectVideo(
|
onSelectVideo(
|
||||||
nvrSettingsView,
|
nvrSettingsView,
|
||||||
camera,
|
camera,
|
||||||
streamType,
|
streamType,
|
||||||
calendarView.selectedRange,
|
calendarView.selectedRange,
|
||||||
recordingModel
|
recordingModel
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
streamViews.push(sv);
|
streamViews.push(sv);
|
||||||
@ -321,10 +321,10 @@ function sendLoginRequest() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let username = $('#login-username').val();
|
const username = $('#login-username').val();
|
||||||
let password = $('#login-password').val();
|
const password = $('#login-password').val();
|
||||||
let submit = $('#login-submit');
|
const submit = $('#login-submit');
|
||||||
let error = $('#login-error');
|
const error = $('#login-error');
|
||||||
|
|
||||||
error.empty();
|
error.empty();
|
||||||
error.removeClass('ui-state-highlight');
|
error.removeClass('ui-state-highlight');
|
||||||
@ -332,36 +332,36 @@ function sendLoginRequest() {
|
|||||||
loginDialog.pending = true;
|
loginDialog.pending = true;
|
||||||
console.info('logging in as', username);
|
console.info('logging in as', username);
|
||||||
api
|
api
|
||||||
.login(username, password)
|
.login(username, password)
|
||||||
.done(() => {
|
.done(() => {
|
||||||
console.info('login successful');
|
console.info('login successful');
|
||||||
loginDialog.dialog('close');
|
loginDialog.dialog('close');
|
||||||
sendTopLevelRequest();
|
sendTopLevelRequest();
|
||||||
})
|
})
|
||||||
.catch((e) => {
|
.catch((e) => {
|
||||||
console.info('login failed:', e);
|
console.info('login failed:', e);
|
||||||
error.show();
|
error.show();
|
||||||
error.addClass('ui-state-highlight');
|
error.addClass('ui-state-highlight');
|
||||||
error.text(e.responseText);
|
error.text(e.responseText);
|
||||||
})
|
})
|
||||||
.always(() => {
|
.always(() => {
|
||||||
submit.button('option', 'disabled', false);
|
submit.button('option', 'disabled', false);
|
||||||
loginDialog.pending = false;
|
loginDialog.pending = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sends the top-level api request. */
|
/** Sends the top-level api request. */
|
||||||
function sendTopLevelRequest() {
|
function sendTopLevelRequest() {
|
||||||
api
|
api
|
||||||
.request(api.nvrUrl(true))
|
.request(api.nvrUrl(true))
|
||||||
.done((data) => onReceivedTopLevel(data))
|
.done((data) => onReceivedTopLevel(data))
|
||||||
.catch((e) => {
|
.catch((e) => {
|
||||||
console.error('NVR load exception: ', e);
|
console.error('NVR load exception: ', e);
|
||||||
onReceivedTopLevel(null);
|
onReceivedTopLevel(null);
|
||||||
if (e.status == 401) {
|
if (e.status == 401) {
|
||||||
loginDialog.dialog('open');
|
loginDialog.dialog('open');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -93,8 +93,8 @@ export default class MoonfireAPI {
|
|||||||
query.split90k = split90k;
|
query.split90k = split90k;
|
||||||
}
|
}
|
||||||
return this._builder.makeUrl(
|
return this._builder.makeUrl(
|
||||||
'cameras/' + cameraUUID + '/' + streamType + '/recordings',
|
'cameras/' + cameraUUID + '/' + streamType + '/recordings',
|
||||||
query
|
query
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,7 +109,7 @@ export default class MoonfireAPI {
|
|||||||
* @return {String} Constructed url
|
* @return {String} Constructed url
|
||||||
*/
|
*/
|
||||||
videoPlayUrl(cameraUUID, streamType, recording, trimmedRange,
|
videoPlayUrl(cameraUUID, streamType, recording, trimmedRange,
|
||||||
timestampTrack = true) {
|
timestampTrack = true) {
|
||||||
let sParam = recording.startId;
|
let sParam = recording.startId;
|
||||||
if (recording.endId !== undefined) {
|
if (recording.endId !== undefined) {
|
||||||
sParam += '-' + recording.endId;
|
sParam += '-' + recording.endId;
|
||||||
|
@ -138,9 +138,9 @@ export default class CalendarTSRange {
|
|||||||
* @return {Range90k} Range object or null if don't have start and end
|
* @return {Range90k} Range object or null if don't have start and end
|
||||||
*/
|
*/
|
||||||
range90k() {
|
range90k() {
|
||||||
return this.hasRange()
|
return this.hasRange() ?
|
||||||
? new Range90k(this.startTime90k, this.endTime90k)
|
new Range90k(this.startTime90k, this.endTime90k) :
|
||||||
: null;
|
null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -167,9 +167,9 @@ export default class CalendarTSRange {
|
|||||||
*/
|
*/
|
||||||
_setRangeTime(range, dateStr, timeStr, dateOnlyThenEndOfDay) {
|
_setRangeTime(range, dateStr, timeStr, dateOnlyThenEndOfDay) {
|
||||||
const newTs90k = this._timeParser.parseDateTime90k(
|
const newTs90k = this._timeParser.parseDateTime90k(
|
||||||
dateStr,
|
dateStr,
|
||||||
timeStr,
|
timeStr,
|
||||||
dateOnlyThenEndOfDay
|
dateOnlyThenEndOfDay
|
||||||
);
|
);
|
||||||
if (newTs90k !== null) {
|
if (newTs90k !== null) {
|
||||||
range.dateStr = dateStr;
|
range.dateStr = dateStr;
|
||||||
|
@ -37,7 +37,7 @@ import Range from './Range';
|
|||||||
*
|
*
|
||||||
* @type {WeakMap}
|
* @type {WeakMap}
|
||||||
*/
|
*/
|
||||||
let _range = new WeakMap();
|
const _range = new WeakMap();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class like Range to represent ranges over timestamps in 90k format.
|
* Class like Range to represent ranges over timestamps in 90k format.
|
||||||
@ -94,8 +94,8 @@ export default class Range90k {
|
|||||||
*/
|
*/
|
||||||
trimmed(against) {
|
trimmed(against) {
|
||||||
return new Range90k(
|
return new Range90k(
|
||||||
Math.max(this.startTime90k, against.startTime90k),
|
Math.max(this.startTime90k, against.startTime90k),
|
||||||
Math.min(this.endTime90k, against.endTime90k)
|
Math.min(this.endTime90k, against.endTime90k)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ export default class Recording {
|
|||||||
* @return {Range90k} Resulting range
|
* @return {Range90k} Resulting range
|
||||||
*/
|
*/
|
||||||
range90k(trimmedAgainst = null) {
|
range90k(trimmedAgainst = null) {
|
||||||
let result = new Range90k(this.startTime90k, this.endTime90k);
|
const result = new Range90k(this.startTime90k, this.endTime90k);
|
||||||
return trimmedAgainst ? result.trimmed(trimmedAgainst) : result;
|
return trimmedAgainst ? result.trimmed(trimmedAgainst) : result;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
@ -65,9 +65,9 @@ export default class Stream {
|
|||||||
*/
|
*/
|
||||||
get range90k() {
|
get range90k() {
|
||||||
return new Range90k(
|
return new Range90k(
|
||||||
this.json_.minStartTime90k,
|
this.json_.minStartTime90k,
|
||||||
this.json_.maxEndTime90k,
|
this.json_.maxEndTime90k,
|
||||||
this.json_.totalDuration90k
|
this.json_.totalDuration90k
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,11 +94,11 @@ export default class Stream {
|
|||||||
*/
|
*/
|
||||||
get days() {
|
get days() {
|
||||||
return new Map(
|
return new Map(
|
||||||
Object.entries(this.json_.days).map(function(t) {
|
Object.entries(this.json_.days).map(function(t) {
|
||||||
let [k, v] = t;
|
let [k, v] = t;
|
||||||
v = new Range90k(v.startTime90k, v.endTime90k, v.totalDuration90k);
|
v = new Range90k(v.startTime90k, v.endTime90k, v.totalDuration90k);
|
||||||
return [k, v];
|
return [k, v];
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,13 +45,13 @@ import moment from 'moment-timezone';
|
|||||||
* @type {RegExp}
|
* @type {RegExp}
|
||||||
*/
|
*/
|
||||||
const timeRe = new RegExp(
|
const timeRe = new RegExp(
|
||||||
[
|
[
|
||||||
'^', // Start
|
'^', // Start
|
||||||
'([0-9]{1,2}:[0-9]{2})', // Capture HH:MM
|
'([0-9]{1,2}:[0-9]{2})', // Capture HH:MM
|
||||||
'(?:(:[0-9]{2})(?::([0-9]{5}))?)?', // Capture [:ss][:FFFFF]
|
'(?:(:[0-9]{2})(?::([0-9]{5}))?)?', // Capture [:ss][:FFFFF]
|
||||||
'([+-][0-9]{1,2}:?(?:[0-9]{2})?)?', // Capture [+-][zone]
|
'([+-][0-9]{1,2}:?(?:[0-9]{2})?)?', // Capture [+-][zone]
|
||||||
'$', // End
|
'$', // End
|
||||||
].join('')
|
].join('')
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -106,7 +106,7 @@ export default class TimeFormatter {
|
|||||||
let format = this._formatStr;
|
let format = this._formatStr;
|
||||||
const ms = ts90k / 90.0;
|
const ms = ts90k / 90.0;
|
||||||
const fracFmt = 'FFFFF';
|
const fracFmt = 'FFFFF';
|
||||||
let fracLoc = format.indexOf(fracFmt);
|
const fracLoc = format.indexOf(fracFmt);
|
||||||
if (fracLoc != -1) {
|
if (fracLoc != -1) {
|
||||||
const frac = ts90k % 90000;
|
const frac = ts90k % 90000;
|
||||||
format =
|
format =
|
||||||
|
@ -70,7 +70,7 @@ export default class TimeStamp90kFormatter {
|
|||||||
formatSameDayShortened(ts1, ts2) {
|
formatSameDayShortened(ts1, ts2) {
|
||||||
let ts1Formatted = this.formatTimeStamp90k(ts1);
|
let ts1Formatted = this.formatTimeStamp90k(ts1);
|
||||||
let ts2Formatted = this.formatTimeStamp90k(ts2);
|
let ts2Formatted = this.formatTimeStamp90k(ts2);
|
||||||
let timePos = this._formatter.formatStr.indexOf('T');
|
const timePos = this._formatter.formatStr.indexOf('T');
|
||||||
if (timePos != -1) {
|
if (timePos != -1) {
|
||||||
const datePortion = ts1Formatted.substr(0, timePos);
|
const datePortion = ts1Formatted.substr(0, timePos);
|
||||||
ts1Formatted = datePortion + ' ' + ts1Formatted.substr(timePos + 1);
|
ts1Formatted = datePortion + ' ' + ts1Formatted.substr(timePos + 1);
|
||||||
|
@ -57,11 +57,11 @@ function minMaxDates(streamViews) {
|
|||||||
* have at least one recording available (allDates).
|
* have at least one recording available (allDates).
|
||||||
*/
|
*/
|
||||||
const allDates = new Set(
|
const allDates = new Set(
|
||||||
[].concat(
|
[].concat(
|
||||||
...streamViews
|
...streamViews
|
||||||
.filter((v) => v.enabled)
|
.filter((v) => v.enabled)
|
||||||
.map((v) => Array.from(v.stream.days.keys()))
|
.map((v) => Array.from(v.stream.days.keys()))
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
return [
|
return [
|
||||||
allDates,
|
allDates,
|
||||||
@ -161,7 +161,7 @@ export default class CalendarView {
|
|||||||
const fromPickerView = this._fromPickerView;
|
const fromPickerView = this._fromPickerView;
|
||||||
const toPickerView = this._toPickerView;
|
const toPickerView = this._toPickerView;
|
||||||
const beforeShowDay = function(date) {
|
const beforeShowDay = function(date) {
|
||||||
let dateStr = date.toISOString().substr(0, 10);
|
const dateStr = date.toISOString().substr(0, 10);
|
||||||
return [dateSet.has(dateStr), '', ''];
|
return [dateSet.has(dateStr), '', ''];
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -226,9 +226,9 @@ export default class CalendarView {
|
|||||||
const pickerElement = event.currentTarget;
|
const pickerElement = event.currentTarget;
|
||||||
const newTimeStr = pickerElement.value;
|
const newTimeStr = pickerElement.value;
|
||||||
const selectedRange = this._selectedRange;
|
const selectedRange = this._selectedRange;
|
||||||
const parsedTS = isEnd
|
const parsedTS = isEnd ?
|
||||||
? selectedRange.setEndTime(newTimeStr)
|
selectedRange.setEndTime(newTimeStr) :
|
||||||
: selectedRange.setStartTime(newTimeStr);
|
selectedRange.setStartTime(newTimeStr);
|
||||||
if (parsedTS === null) {
|
if (parsedTS === null) {
|
||||||
console.warn('bad time change');
|
console.warn('bad time change');
|
||||||
$(pickerElement).addClass('ui-state-error');
|
$(pickerElement).addClass('ui-state-error');
|
||||||
@ -236,7 +236,7 @@ export default class CalendarView {
|
|||||||
}
|
}
|
||||||
$(pickerElement).removeClass('ui-state-error');
|
$(pickerElement).removeClass('ui-state-error');
|
||||||
console.log(
|
console.log(
|
||||||
(isEnd ? 'End' : 'Start') +
|
(isEnd ? 'End' : 'Start') +
|
||||||
' time changed to: ' +
|
' time changed to: ' +
|
||||||
parsedTS +
|
parsedTS +
|
||||||
' (' +
|
' (' +
|
||||||
@ -261,9 +261,9 @@ export default class CalendarView {
|
|||||||
* changes. We need to determine a new selected range and activiate it.
|
* changes. We need to determine a new selected range and activiate it.
|
||||||
* Doing so will then also inform the change listener.
|
* Doing so will then also inform the change listener.
|
||||||
*/
|
*/
|
||||||
const endDate = isSameDay
|
const endDate = isSameDay ?
|
||||||
? this.selectedRange.start.dateStr
|
this.selectedRange.start.dateStr :
|
||||||
: this.selectedRange.end.dateStr;
|
this.selectedRange.end.dateStr;
|
||||||
this._updateRangeDates(this.selectedRange.start.dateStr, endDate);
|
this._updateRangeDates(this.selectedRange.start.dateStr, endDate);
|
||||||
this._sameDay = isSameDay;
|
this._sameDay = isSameDay;
|
||||||
|
|
||||||
@ -334,7 +334,7 @@ export default class CalendarView {
|
|||||||
initializeWith(streamViews) {
|
initializeWith(streamViews) {
|
||||||
this._streamViews = streamViews;
|
this._streamViews = streamViews;
|
||||||
[this._availableDates, this._minDateStr, this._maxDateStr] = minMaxDates(
|
[this._availableDates, this._minDateStr, this._maxDateStr] = minMaxDates(
|
||||||
streamViews
|
streamViews
|
||||||
);
|
);
|
||||||
this._configureDatePickers();
|
this._configureDatePickers();
|
||||||
|
|
||||||
|
@ -83,11 +83,11 @@ export default class DatePickerView {
|
|||||||
_initWithOptions(options = null) {
|
_initWithOptions(options = null) {
|
||||||
this._alive = true;
|
this._alive = true;
|
||||||
options =
|
options =
|
||||||
options !== null
|
options !== null ?
|
||||||
? options
|
options :
|
||||||
: {
|
{
|
||||||
disabled: true,
|
disabled: true,
|
||||||
};
|
};
|
||||||
this._pickerElement.datepicker(options);
|
this._pickerElement.datepicker(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ export default class RecordingsView {
|
|||||||
* @param {jQuery} parent Parent to which new DOM is attached, or null
|
* @param {jQuery} parent Parent to which new DOM is attached, or null
|
||||||
*/
|
*/
|
||||||
constructor(camera, streamType, recordingFormatter, trimmed = false,
|
constructor(camera, streamType, recordingFormatter, trimmed = false,
|
||||||
parent = null) {
|
parent = null) {
|
||||||
this._cameraName = camera.shortName;
|
this._cameraName = camera.shortName;
|
||||||
this._cameraRange = camera.range90k;
|
this._cameraRange = camera.range90k;
|
||||||
this._formatter = recordingFormatter;
|
this._formatter = recordingFormatter;
|
||||||
@ -107,17 +107,17 @@ export default class RecordingsView {
|
|||||||
_createElement(id, cameraName, streamType) {
|
_createElement(id, cameraName, streamType) {
|
||||||
const tab = $('<tbody>').attr('id', id);
|
const tab = $('<tbody>').attr('id', id);
|
||||||
tab.append(
|
tab.append(
|
||||||
$('<tr class="name">').append($('<th colspan=6/>')
|
$('<tr class="name">').append($('<th colspan=6/>')
|
||||||
.text(cameraName + ' ' + streamType)),
|
.text(cameraName + ' ' + streamType)),
|
||||||
$('<tr class="hdr">').append(
|
$('<tr class="hdr">').append(
|
||||||
$(
|
$(
|
||||||
_columnOrder
|
_columnOrder
|
||||||
.map((name) => '<th>' + _columnLabels[name] + '</th>')
|
.map((name) => '<th>' + _columnLabels[name] + '</th>')
|
||||||
.join('')
|
.join('')
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
$('</tr>'),
|
$('</tr>'),
|
||||||
$('<tr class="loading"><td colspan=6>loading...</td></tr>').hide()
|
$('<tr class="loading"><td colspan=6>loading...</td></tr>').hide()
|
||||||
);
|
);
|
||||||
return tab;
|
return tab;
|
||||||
}
|
}
|
||||||
@ -136,8 +136,8 @@ export default class RecordingsView {
|
|||||||
this._element.children('tr.r').each((rowIndex, row) => {
|
this._element.children('tr.r').each((rowIndex, row) => {
|
||||||
const values = this._formatter.format(recordings[rowIndex], trimRange);
|
const values = this._formatter.format(recordings[rowIndex], trimRange);
|
||||||
$(row)
|
$(row)
|
||||||
.children('td')
|
.children('td')
|
||||||
.each((index, element) => $(element).text(values[_columnOrder[index]]));
|
.each((i, e) => $(e).text(values[_columnOrder[i]]));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -269,7 +269,7 @@ export default class RecordingsView {
|
|||||||
// Remove existing rows, replace with new ones
|
// Remove existing rows, replace with new ones
|
||||||
$('tr.r', tbody).remove();
|
$('tr.r', tbody).remove();
|
||||||
this._recordings.forEach((r) => {
|
this._recordings.forEach((r) => {
|
||||||
let row = $('<tr class="r" />');
|
const row = $('<tr class="r" />');
|
||||||
row.append(_columnOrder.map(() => $('<td/>')));
|
row.append(_columnOrder.map(() => $('<td/>')));
|
||||||
row.on('click', () => {
|
row.on('click', () => {
|
||||||
console.log('Video clicked');
|
console.log('Video clicked');
|
||||||
|
@ -53,7 +53,7 @@ export default class StreamSelectorView {
|
|||||||
|
|
||||||
if (cameras.length !== 0) {
|
if (cameras.length !== 0) {
|
||||||
// Add a header row.
|
// Add a header row.
|
||||||
let hdr = $('<tr/>').append($('<th/>'));
|
const hdr = $('<tr/>').append($('<th/>'));
|
||||||
for (const streamType of allStreamTypes) {
|
for (const streamType of allStreamTypes) {
|
||||||
hdr.append($('<th/>').text(streamType));
|
hdr.append($('<th/>').text(streamType));
|
||||||
}
|
}
|
||||||
@ -61,7 +61,7 @@ export default class StreamSelectorView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._cameras.forEach((c) => {
|
this._cameras.forEach((c) => {
|
||||||
let row = $('<tr/>').append($('<td>').text(c.camera.shortName));
|
const row = $('<tr/>').append($('<td>').text(c.camera.shortName));
|
||||||
let firstStreamType = true;
|
let firstStreamType = true;
|
||||||
for (const streamType of allStreamTypes) {
|
for (const streamType of allStreamTypes) {
|
||||||
const streamView = c.streamViews[streamType];
|
const streamView = c.streamViews[streamType];
|
||||||
@ -69,7 +69,9 @@ export default class StreamSelectorView {
|
|||||||
row.append('<td/>');
|
row.append('<td/>');
|
||||||
} else {
|
} else {
|
||||||
const id = 'cam-' + c.camera.uuid + '-' + streamType;
|
const id = 'cam-' + c.camera.uuid + '-' + streamType;
|
||||||
let cb = $('<input type="checkbox">').attr('name', id).attr('id', id);
|
const cb = $('<input type="checkbox">')
|
||||||
|
.attr('name', id)
|
||||||
|
.attr('id', id);
|
||||||
|
|
||||||
// Only the first stream type for each camera should be checked
|
// Only the first stream type for each camera should be checked
|
||||||
// initially.
|
// initially.
|
||||||
|
@ -44,21 +44,21 @@ export default class StreamView {
|
|||||||
* @param {[type]} recordingsParent Parent element to attach to or null)
|
* @param {[type]} recordingsParent Parent element to attach to or null)
|
||||||
*/
|
*/
|
||||||
constructor(
|
constructor(
|
||||||
cameraModel,
|
cameraModel,
|
||||||
streamType,
|
streamType,
|
||||||
recordingFormatter,
|
recordingFormatter,
|
||||||
trimmed,
|
trimmed,
|
||||||
recordingsParent = null
|
recordingsParent = null
|
||||||
) {
|
) {
|
||||||
this.camera = cameraModel;
|
this.camera = cameraModel;
|
||||||
this.streamType = streamType;
|
this.streamType = streamType;
|
||||||
this.stream = cameraModel.streams[streamType];
|
this.stream = cameraModel.streams[streamType];
|
||||||
this.recordingsView = new RecordingsView(
|
this.recordingsView = new RecordingsView(
|
||||||
this.camera,
|
this.camera,
|
||||||
this.streamType,
|
this.streamType,
|
||||||
recordingFormatter,
|
recordingFormatter,
|
||||||
trimmed,
|
trimmed,
|
||||||
recordingsParent
|
recordingsParent
|
||||||
);
|
);
|
||||||
this._enabled = true;
|
this._enabled = true;
|
||||||
this.recordingsUrl = null;
|
this.recordingsUrl = null;
|
||||||
|
@ -65,7 +65,7 @@ export default class VideoDialogView {
|
|||||||
attach(domElement) {
|
attach(domElement) {
|
||||||
this._videoElement = $('<video controls preload="auto" autoplay="true" />');
|
this._videoElement = $('<video controls preload="auto" autoplay="true" />');
|
||||||
this._dialogElement = $('<div class="playdialog" />').append(
|
this._dialogElement = $('<div class="playdialog" />').append(
|
||||||
this._videoElement
|
this._videoElement
|
||||||
);
|
);
|
||||||
$(domElement).append(this._dialogElement);
|
$(domElement).append(this._dialogElement);
|
||||||
return this;
|
return this;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user