Shinobi/web/assets/js/bs5.liveGrid.cycle.js

164 lines
5.6 KiB
JavaScript

var liveGridCycleTimer = null;
var cycleLiveOptionsBefore = null;
var cycleLiveOptions = null;
var cycleLiveMoveNext = function(){}
var cycleLiveMovePrev = function(){}
var cycleLiveFullList = null
var cycleLiveCurrentPart = null
function getListOfMonitorsToCycleLive(chosenTags,useMonitorIds){
var monitors = []
if(useMonitorIds){
monitors = getMonitorsFromIds(chosenTags)
}else if(chosenTags){
var tags = sanitizeTagList(chosenTags)
monitors = getMonitorsFromTags(tags)
}else{
monitors = getRunningMonitors(true)
}
return monitors;
}
function getPartForCycleLive(fullList, afterMonitorId, numberOfMonitors) {
const startIndex = afterMonitorId ? fullList.findIndex(monitor => monitor.mid === afterMonitorId) : -1;
const result = [];
for (let i = 1; i <= numberOfMonitors; i++) {
const index = (startIndex + i) % fullList.length;
result.push(fullList[index]);
}
return result;
}
function displayCycleSetOnLiveGrid(monitorsList){
cycleLiveCurrentPart = [].concat(monitorsList)
closeAllLiveGridPlayers()
monitorsWatchOnLiveGrid(monitorsList.map(monitor => monitor.mid))
}
// rotator
function stopCycleLive(){
console.error('STOP!!!!!',new Error)
clearTimeout(liveGridCycleTimer)
liveGridCycleTimer = null
}
function resumeCycleLive(fullList,partForCycle,numberOfMonitors){
console.error('RESUME!!!!!',new Error)
function next(){
var afterMonitorId = partForCycle.slice(-1)[0].mid;
partForCycle = getPartForCycleLive(fullList,afterMonitorId,numberOfMonitors)
displayCycleSetOnLiveGrid(partForCycle)
reset()
}
function prev(){
var firstInPart = partForCycle[0].mid;
var firstPartIndex = fullList.findIndex(monitor => monitor.mid === firstInPart)
var backedToIndex = (firstPartIndex - (numberOfMonitors + 1) + fullList.length) % fullList.length;
var beforeMonitorId = fullList[backedToIndex].mid
partForCycle = getPartForCycleLive(fullList,beforeMonitorId,numberOfMonitors, true)
displayCycleSetOnLiveGrid(partForCycle)
reset()
}
function reset(){
clearTimeout(liveGridCycleTimer)
liveGridCycleTimer = setTimeout(function(){
next()
},30000)
}
reset()
cycleLiveMoveNext = next
cycleLiveMovePrev = prev
}
function beginCycleLive({
chosenTags,
useMonitorIds,
numberOfMonitors,
monitorHeight,
}){
var fullList = getListOfMonitorsToCycleLive(chosenTags,useMonitorIds)
var partForCycle = getPartForCycleLive(fullList,null,numberOfMonitors)
cycleLiveFullList = [].concat(fullList)
displayCycleSetOnLiveGrid(partForCycle)
stopCycleLive()
resumeCycleLive(fullList,partForCycle,numberOfMonitors)
}
dashboardSwitchCallbacks.cycleLiveGrid = function(toggleState){
if(toggleState !== 1){
cycleLiveOptions = null
cycleLiveOptionsBefore = null
stopCycleLive()
}else{
openTab('liveGrid')
cycleLiveOptionsBefore = cycleLiveOptions ? Object.assign({},cycleLiveOptions) : null
const theLocalStorage = dashboardOptions()
const cycleLivePerRow = parseInt(theLocalStorage.cycleLivePerRow) || 2
const cycleLiveNumberOfMonitors = parseInt(theLocalStorage.cycleLiveNumberOfMonitors) || 4
const cycleLiveMonitorHeight = parseInt(theLocalStorage.cycleLiveMonitorHeight) || 4
cycleLiveOptions = {
chosenTags: null,
useMonitorIds: null,
monitorsPerRow: cycleLivePerRow,
numberOfMonitors: cycleLiveNumberOfMonitors,
monitorHeight: cycleLiveMonitorHeight,
}
beginCycleLive(cycleLiveOptions)
}
}
function keyShortcutsForCycleLive(enable) {
function cleanup(){
document.removeEventListener('keydown', keyShortcuts['cycleLive'].keydown);
document.removeEventListener('keyup', keyShortcuts['cycleLive'].keyup);
delete(keyShortcuts['cycleLive'])
}
if(enable){
let isKeyPressed = false;
function handleKeyboard(event){
if (isKeyPressed) {
return;
}
event.preventDefault();
switch(event.code){
case 'Space':
isKeyPressed = true;
if(liveGridCycleTimer){
stopCycleLive()
}else{
resumeCycleLive(
cycleLiveFullList,
cycleLiveCurrentPart,
cycleLiveOptions.numberOfMonitors
)
}
break;
case 'ArrowLeft':
isKeyPressed = true;
cycleLiveMovePrev();
break;
case 'ArrowRight':
isKeyPressed = true;
cycleLiveMoveNext();
break;
}
}
function handleKeyup(event) {
isKeyPressed = false;
}
keyShortcuts['cycleLive'] = {
keydown: handleKeyboard,
keyup: handleKeyup,
}
document.addEventListener('keydown', keyShortcuts['cycleLive'].keydown);
document.addEventListener('keyup', keyShortcuts['cycleLive'].keyup);
}else{
cleanup()
}
}
addOnTabOpen('liveGrid', function () {
keyShortcutsForCycleLive(true)
})
addOnTabReopen('liveGrid', function () {
if(cycleLiveOptions){
beginCycleLive(cycleLiveOptions)
}
keyShortcutsForCycleLive(true)
})
addOnTabAway('liveGrid', function () {
stopCycleLive()
keyShortcutsForCycleLive(false)
})